bagaimana memverifikasi metode objek non-tiruan disebut?

103

Tampaknya mockito hanya memverifikasi apakah metode objek tiruan dipanggil dan objek tiruan selalu memiliki sesuatu seperti itu doReturn().when(mock object)

Tapi bisakah saya membuat objek tiruan dan mendefinisikan doReturn().when(mock object) dan kemudian memverifikasi metode objek lain yang dipanggil?

Inilah yang ingin saya lakukan: Saya mendefinisikan mockEnvironment dan mengembalikan respons apa pun yang terjadi. Tapi kemudian saya ingin memverifikasi metode yang berbeda dari anotherObj dipanggil dalam kasus yang berbeda.

Bagaimana cara melakukannya?

public class BaseClass {
    private Environment mockEnvironment;
    @Test
    public void testcase () {
     setMockitoEnvironment(); 
     response = foo(mockEnvironment, argument1);
     verify(anotherObj).codePath1(...);
     response = foo(mockEnvironment, argument2);
     verify(anotherObj).codePath2(...);
   }
}

//this method successfully return a response with any input 
//because I do not care how response is eventually generated, 
//I only care whether code path reaches createResponse() via 
//code path 1 or code path 2.
private void setMockitoEnvironment() {
    mockEnvironment = mock(Environment.class);
    doReturn (response).when(mockEnvironment).createResponse(for any input);
}
private Response foo(...) {
    ... 
    return createResponse(...);
}
pengguna389955
sumber

Jawaban:

121

Anda dapat menggunakan Mockito Spy untuk ini. Jika Anda mengatur anotherObjsebagai mata-mata, Anda dapat memverifikasi panggilan metode pada objek itu. Dalam contoh Anda, Anda perlu memastikan bahwa panggilan untuk foomenggunakan mata-mata, bukan implementasi biasa anotherObj. Mata-mata itu menyiapkan sesuatu seperti ini:

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff -- e.g. anotherObjSpy.foo(...);
verify(anotherObjSpy).codePath1(...);
K Erlandsson
sumber
Itu berarti saya mungkin perlu membuat dan memasukkan beberapa objek tiruan jika saya ingin memverifikasi banyak hal? itu tidak nyaman.
pengguna389955
@ user389955 ya, Anda perlu mengatur setiap objek yang ingin Anda periksa sebagai mata-mata. Sejauh yang saya tahu tidak ada jalan lain. Mockito perlu menambahkan proxy ke objek dan seseorang harus memberi tahu Mockito objek mana yang akan di-proxy.
K Erlandsson
10
Alih-alih mengatakan "// lakukan hal-hal", mungkin berguna untuk menambahkan bahwa "anotherObjSpy" yang harus membuat panggilan metode diuji.
jwehrle
Terima kasih @jwehrle, Anda perlu menggunakan anotherObjSpy dalam panggilan, jika tidak pengujian tidak akan berhasil.
Argoth
2

Beri anotasi pada objek bukan tiruan dengan @Spyanotasi lalu periksa verify(). Periksa ini

CodeHunter
sumber