Pertanyaan Unit Layanan Pengujian Komposit Layanan


Saya sedang menulis (junit) tes unit untuk kelas yang mengimplementasikan antarmuka terbuka dengan metode seperti:

public Set<Setting> getUserSettings();

public Set<Setting> getOrganizationSettings();

public Set<Setting> getDefaults();

public Set<Setting> getAllSettings();

Metode untuk mendapatkan Pengaturan dari lapisan tertentu melakukan IO dari berbagai tempat untuk mengambil hasil mereka. getAllSettings () Mengembalikan satu set dari semua Pengaturan di semua level, dengan tingkat 'paling atas' memiliki preferensi (yaitu jika pengaturan ada di tingkat default dan pengguna, pengaturan di tingkat pengguna akan digunakan.

Saya sudah menulis tes unit untuk getUserSettings (), getOrganizationSettings (), getDefaults (), mengejek operasi IO dengan objek Mocked.

Implementasi untuk getAllSettings () terlihat seperti itu

public Set<Setting> getAllSettings(){
    Set<Setting> defaults = getUserSettings();
    Set<Setting> custom = getOrganizationSettings();
    Set<Setting> undefined = getDefaults();
    //perform some sorting and business logic
    //return fully sorted set

}

Pertanyaan saya terletak pada bagaimana unit menguji metode getAllSettings (). Apakah saya menggunakan tiruan (menggunakan easymock / powermock) untuk semua panggilan sumber daya hilir yang digunakan oleh pengguna / organisasi / metode Pengaturan default? Sepertinya akan ada cara yang lebih bersih / lebih baik / mudah untuk melakukannya.


4
2018-03-24 15:07


asal


Jawaban:


Anda dapat menulis tes dalam bentuk berikut

@Test
public void testGetAllSettings() {
   Foo fixture = new Foo() {
       public Set<Setting> getUserSettings() { // canned impl }
       public Set<Setting> getOrganizationSettings() { // canned impl }
       public Set<Setting> getDefaults() { // canned impl }
   }

   Assert.assertEquals(whatEverItShouldEqual, fixture.getAllSettings());
}

Ini akan memungkinkan Anda menguji logika untuk mendapatkan semua pengaturan, terlepas dari metode lain.

Alternatif lain adalah dengan mencemooh IO dari metode ini. Jika Anda memiliki lapisan yang melakukan logika IO, maka itu bisa diejek. Seperti yang Anda sebutkan, ini bisa menjadi sakit jika Anda memiliki banyak dependensi. Mungkin tanda bahwa Anda membutuhkan lebih sedikit ketergantungan? (mungkin kelas harus dipecah menjadi unit yang lebih kecil misalnya?)


5
2018-03-24 15:14