Java, voki yöntemi çağrılarını Mockito ile n kez doğrular


141

Bir (void) yönteminin bir DAO içinde çağrıldığını doğrulamaya çalışıyorum - o noktaya kadar sonuçların bir listesini gönderir, listeyi sıfırlar ve devam eder. Diyelim ki listede 4 şey var ve 1 puanım var, "gönderme" yönteminin 4 kez çağrılmasını beklerim. Yöntemin bir kez çağrılarak alındığını doğrulayabilirim

Mockito.verify(mock).send()

geçer .. ama kaç kez çağrıldığını doğrulamak istiyorum. Düşünürdüm

Mockito.verify(mock.send(), times(4))

yeterli olacaktır, ancak parametrelerin doğrulamak için doğru olmadığını söylüyor.

Ben değiştirirseniz arada, Mockito.verify(mock).send()hiç Mockito.verify(mock.send())veya Mockito.verify((mock).send())aynı hatayı alıyorum. Bununla ilgili düşünceler?


10
Deneyin Mockito.verify(mock, times(4)).send(). Neden send()yöntem içinde yöntem çağrısı "taşındı" merak ediyorum verify. Zaten doğru sözdizimine sahiptiniz.
Tom


Ayrıca, bir şeyin kaç kez arandığını umursamıyorsanız, yazabilirsinizverify(mock, atLeastOnce()).send();
Dawood ibn Kareem

Teşekkür ederim, doğru. Karıştırıcı bulduğum şey Mockito.verify(mock).send()geçti ama sadece onu kapsüllemek bir hataya neden oldu, hiçbir şey değiştirmedi. Ancak, bu bir kazanç!
nbpeth

Yanıtlar:


238

Gerekli yöntem Mockito # doğrulamaktır :

public static <T> T verify(T mock,
                           VerificationMode mode)

mocksenin alay nesnedir ve modebir VerificationModesahte doğrulanması gerekir açıklamaktadır söyledi. Olası modlar :

verify(mock, times(5)).someMethod("was called five times");
verify(mock, never()).someMethod("was never called");
verify(mock, atLeastOnce()).someMethod("was called at least once");
verify(mock, atLeast(2)).someMethod("was called at least twice");
verify(mock, atMost(3)).someMethod("was called at most 3 times");
verify(mock, atLeast(0)).someMethod("was called any number of times"); // useful with captors
verify(mock, only()).someMethod("no other method has been called on the mock");

Yöntemi ve bu doğrulama modlarını Mockitokullanmak için sınıftan bu statik içe aktarmalara ihtiyacınız olacaktır verify:

import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.only;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

Yani sizin durumunuzda doğru sözdizimi:

Mockito.verify(mock, times(4)).send()

Bu, yöntemin sahte nesnede 4 kez sendçağrıldığını doğrular . 4 kereden az veya daha fazla çağrılırsa başarısız olacaktır.


Sadece kontrol etmek istiyorsanız, yöntem bir kez çağrıldıysa, bir geçmeniz gerekmez VerificationMode. Basit

verify(mock).someMethod("was called once");

Yeterli olacaktır. Dahili olarak kullanır verify(mock, times(1)).someMethod("was called once");.


Bir "arasında" doğrulaması elde etmek için aynı modelde birden fazla doğrulama çağrısına sahip olmak mümkündür. Mockito böyle bir şeyi desteklemiyor verify(mock, between(4,6)).someMethod("was called between 4 and 6 times");, ancak yazabiliyoruz

verify(mock, atLeast(4)).someMethod("was called at least four times ...");
verify(mock, atMost(6)).someMethod("... and not more than six times");

bunun yerine, aynı davranışı elde etmek için. Sınırlar dahil edilmiştir , bu nedenle yöntem 4, 5 veya 6 kez çağrıldığında test durumu yeşildir.


1
VerificationModeYöntemlerin nerede olduğunu bulmak isteyen herkes için (statik içe aktarma veya açık referans için), içerdiler org.mockito.internal.verification.VerificationModeFactory.
Steve Chambers

verify(mock, atLeast(0)).someMethod("was called any number of times");arama doğrulamasını yok saymak yardımcı oldu
tj-recess

2
verify(between(m,n))m ve n arasındaki çağrı sayısını doğrulayan bir şey var mı?
nishant

2
Hayır @nishant, mockito Bunu destekleyecek gibi görünmüyor, ancak çağırabilir verifyile kat atLeast(M)ve atMost(n)aynı davranışı elde etmek. Bunu açıklamak için cevabı düzenledim.
Tom

@KevinWelker Haklısın, hakkındaki bilgileri kaldırdım VerificationModeFactory. Hala en yeni sürümde mevcut, ancak iç sınıfların kullanılmaması gerektiğini kabul ediyorum.
Tom
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.