Menulis tes JUnit untuk memeriksa data SharedPreferences

Saya baru mengenal pengujian unit di Android dan upaya saya adalah assertTrue agar data berhasil diteruskan ke suatu metode dan disimpan di SharedPreferences. Ini adalah tes saya sejauh ini:

public class AuthTest {

    Authorization authorization = new Authorization();

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test_IfAuthIsSaved() {
        //test if the auth object is saved in the auth object is saved as a.. 
        //..json string in Shared preferences
        Auth auth = mock(Auth.class);
        authorization.saveAuth(auth);

        //test if the auth is received and saved to sharedpreferences
    }

}

metode simpanAuth:

public void saveAuth(Auth auth) {
    editor.putString("USER_AUTH", new Gson().toJson(auth));
    editor.commit();
}

Seperti apa pernyataannya mengenai hal ini?


person Dinuka Jay    schedule 29.09.2017    source sumber
comment
Lihat ini: stackoverflow.com /pertanyaan/35105545/   -  person Haresh Chhelana    schedule 29.09.2017


Jawaban (3)


Anda mengejek Auth yang tidak berinteraksi dengan apa pun dalam kode Anda sehingga Anda tidak dapat melakukan pernyataan apa pun terhadapnya.

Anda perlu mengubah pendekatan pengujian Anda:

Pendekatan pertama

  • Tiruan SharedPreferences.Editor dan masukkan ke dalam Authorization.
  • Buat instance objek Auth baru dan aktifkan authorization.saveAuth(auth).
  • Tegaskan bahwa editorMock.putString() dipanggil dengan json yang diharapkan.
  • Tegaskan bahwa editorMock.commit() dipanggil.

Pendekatan ini memiliki beberapa kelemahan:

  • pengujian Anda digabungkan dengan implementasi.
  • jika Anda memutuskan untuk menyimpan data Auth dalam bentuk lain, Anda perlu mengubah pengujiannya
  • Anda tidak benar-benar menguji perilaku (yang sebenarnya ingin Anda lakukan)

Pendekatan ke-2

  • Buat implementasi palsu SharedPreferences.Editor dan masukkan ke dalam Authorization.
  • Buat objek Auth baru dan aktifkan authorization.saveAuth(auth).
  • Ambil autentikasi setelah menyimpannya dengan memanggil authorization.getAuth() dan nyatakan bahwa itu adalah Auth yang sama dengan yang Anda simpan.

Kekurangan: * Anda perlu membuat implementasi palsu dari ``SharedPrefereces.Editor``` untuk tujuan pengujian yang mensimulasikan perilaku yang sama

Keuntungan: * pengujian Anda tidak dibarengi dengan implementasi * Anda bebas mengubah implementasi tanpa mengubah pengujian * Anda menguji perilaku, bukan metode

Beberapa referensi untuk membuat cadangan pendekatan kedua:

Sekarang, dari sudut pandang teknis, pengambilan objek yang disimpan sebenarnya merupakan bagian dari penciptaan, karena ...

Desain Berbasis Domain oleh Eric Evans

person NewestStackOverflowUser    schedule 29.09.2017

Anda tidak perlu mengejek kelas Auth. Ini lebih tentang editor.

1) Pindahkan new Gson().toJson(auth) ke metode tingkat paket terpisah:

JSONObject toJson(Auth auth){
   return new Gson().toJson(auth);
}

2) Tes:

public class AuthTest {
    @InjectMocks
    @Spy
    Authorization authorization;

    @Mock
    private Editor editorMock;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test_IfAuthIsSaved() {
        // Arrange
       JSONObject jsonO = mock(JSONObject.class);

        Auth auth = mock(Auth.class);
        doReturn(jsonO).when(authorization).toJson(auth);            

        // Act
        authorization.saveAuth(auth);

        // Assert
        verify(editorMock).putString(Mockito.eq("USER_AUTH"), Mockito.eq(jsonO));
        verify(editorMock).commit();
    }

}

Saya berasumsi editor adalah ketergantungan bidang contoh;

person Maciej Kowalski    schedule 29.09.2017

Bagaimana jika konstruktor Otorisasi memiliki SharedPrefrences.

val sharedPreferences = Mockito.mock(SharedPreferences::class.java)
val editor = Mockito.mock(SharedPreferences.Editor::class.java)
Mockito.`when`(sharedPreferences.edit()).thenReturn(editor)

val authorization = Authorization(sharedPreferences)
val auth = ...
authorization.saveAuth(auth)

verify(editor).putString(...)
person illusionJJ    schedule 15.05.2019