Pertanyaan Bagaimana cara mengejek metode Bundle di Android Unit-Test?


Saya memiliki satu kelas kontroler yang menangani pembuatan Fragmen. Katakanlah seperti di bawah ini:

public class FragmentController {

    public static Fragment newInstance(String title, int total) {
        return total > 0? MultipleDataFragment.newInstance(title, total)
            : SingleDataFragment.newInstance(title);
    }
}
public class MultipleDataFragment extends Fragment {
    public static MultipleDataFragment newInstance( String title, int total) {
        Bundle b = new Bundle();
        b.putString("title", title);
        b.putInt("total", total);
    }
}
public class SingleDataFragment extends Fragment {
    public static SingleDataFragment newInstance( String title, int total) {
        Bundle b = new Bundle();
        b.putString("title", title);
        b.putInt("total", total);
    }
}

Dalam pengujian saya (kelas tes Junit4 standar) saya punya:

@Test
public void testNewInstanceCreteMultipleData() throws Exception {
    Fragment f = FragmentController.newInstance("Hello", 5);

    assertTrue("MultipleDataFragment should be created"
        , f instanceOf MultipleDataFragment);
}

Karena aku tidak mengejek Bundel, aku mengerti.

java.lang.RuntimeException: Method putString not mocked.Set

Pertanyaannya adalah bagaimana saya mengejek objek Bundle sehingga tes dapat dijalankan? Apakah saya perlu metode statis di dalam setiap kelas yang membuat objek Bundle dan menggunakannya sebagai gantinya atau apakah ada pendekatan yang lebih baik untuk ini?

Setiap contoh untuk ini dihargai.


4
2018-02-22 16:52


asal


Jawaban:


Salah satu cara adalah dengan menggunakan kerangka mengejek yang kuat seperti PowerMock, yang bahkan dapat mencegat pembangunan objek baru.

Ini seharusnya bekerja untuk Anda, tetapi mengejek kelas "sederhana" seperti Bundle berarti beberapa upaya - Anda juga bisa menggunakan implementasi nyata dengan menggunakan Unmock plugin.


5
2018-02-23 08:15



Menggunakan Unmock plugin untuk membatalkan kelas Bundle. Anda harus un-mock dengan Android 4.4 (unmock 'org.robolectric:android-all:4.4_r1-robolectric-1') karena versi Android yang lebih baru merujuk pada metode Java yang tidak standar.

Anda juga harus menjaga ArrayMap dan MapCollections.


0
2018-01-31 02:18