sahte olmayan bir nesnenin yöntemi nasıl doğrulanır denir?


103

Görünüşe göre sahte, yalnızca sahte bir nesnenin yönteminin çağrılıp çağrılmadığını ve sahte nesnenin her zaman buna benzer doReturn().when(mock object)

Ama sahte bir nesne oluşturup doReturn().when(mock object) başka bir nesnenin yönteminin çağrıldığını tanımlayıp doğrulayabilir miyim?

İşte yapmak istediğim şey: Sahte bir ortam tanımlıyorum ve ne olursa olsun bir yanıt döndürüyorum. Ama sonra başka birObj'nin farklı yöntemlerinin farklı durumlarda çağrıldığını doğrulamak istiyorum.

Bu nasıl yapılır?

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(...);
}

Yanıtlar:


121

Bunun için bir Mockito Casusu kullanabilirsiniz . Kurulum Eğer anotherObjsöz konusu nesne üzerinde yöntem çağrıları doğrulayabilir casus olarak. Örneğinizde, aramanın foosıradan bir uygulama yerine casusu kullandığından emin olmanız gerekir anotherObj. Casus şöyle bir şey kuruyor:

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff -- e.g. anotherObjSpy.foo(...);
verify(anotherObjSpy).codePath1(...);

Bu, birden çok şeyi doğrulamak istiyorsam, birden çok alay konusu nesneyi oluşturmam ve enjekte etmem gerekebileceği anlamına mı geliyor? bu uygun değil.
user389955

@ user389955 evet, casus olarak kontrol etmek istediğiniz her nesneyi ayarlamanız gerekir. Bildiğim kadarıyla bunun başka yolu yok. Mockito'nun nesnelere bir proxy eklemesi gerekiyor ve birisi Mockito'ya hangi nesnelerin proxy yapacağını söylemelidir.
K Erlandsson

10
"// şeyler yap" demek yerine, test edilen yöntem çağrısını yapması gereken "anotherObjSpy" olduğunu eklemek faydalı olabilir.
jwehrle

Teşekkürler @jwehrle, görüşmelerde başka bir ObjSpy kullanmanız gerekir, aksi takdirde testler işe yaramaz.
argoth

2

Sahte olmayan nesneye @Spyaçıklama ekleyin ve ardından kontrol edin verify(). Bunu kontrol et

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.