Mockito'nun genel “any ()” yöntemini kullanma


194

Ben bir dizi bekliyor bir yöntem ile bir arayüz var Foo:

public interface IBar {
  void doStuff(Foo[] arr);
}

Mockito kullanarak bu arayüzü alay ediyorum ve doStuff()denilen iddia etmek istiyorum, ama hangi argümanın geçtiğini doğrulamak istemiyorum - "umurumda değil".

Aşağıdaki kodu any()genel yöntemi kullanarak nasıl yazarım anyObject()?

IBar bar = mock(IBar.class);
...
verify(bar).doStuff((Foo[]) anyObject());

Yanıtlar:


111

Java 8'den beri argümansız anyyöntemi kullanabilirsiniz ve tür argümanı derleyici tarafından çıkarılacaktır:

verify(bar).doStuff(any());

açıklama

Java 8'deki yeni şey , bir ifadenin hedef türünün , alt ifadelerinin tür parametrelerini çıkarmak için kullanılacağıdır. Java 8'den önce yalnızca type parametresi çıkarımı için kullanılan yöntemlerle ilgili argümanlar (çoğu zaman).

Bu durumda, parametre türü doStuff, hedef tür olacaktır any()ve dönüş değeri türü, any()bu bağımsız değişken türüyle eşleşecek şekilde seçilir.

Bu mekanizma, esas olarak lambda ifadelerini derleyebilmek için Java 8'de eklenmiştir, ancak genellikle tür çıkarımlarını geliştirir.


İlkel tipler

Bu ne yazık ki ilkel tiplerle çalışmaz:

public interface IBar {
    void doPrimitiveStuff(int i);
}

verify(bar).doPrimitiveStuff(any()); // Compiles but throws NullPointerException
verify(bar).doPrimitiveStuff(anyInt()); // This is what you have to do instead

Sorun derleyici Integerdönüş değeri olarak çıkarım olacaktır any(). Mockito bunun farkında olmayacak (tür silme nedeniyle) ve referans türleri için varsayılan değeri döndürecektir null. Çalışma zamanı, intValuegeçmeden önce üzerinde yöntemi çağırarak dönüş değerini kutudan çıkarmaya çalışır doStuffve istisna atılır.


Bu cevap her oyunda hoş bir sürpriz oldu! anyMetod sadece işe yarayacağından , Java 8'den beri sorunun çok dikkat çekmeyeceğini tahmin ederdim . Sadece işe yarayan şeyler için cevap aramazsınız!
Lii

Buraya geldim çünkü kodumun neden işe yaramadığını bilmiyordum, any()ancak anyBoolean()cevabınızın son kısmı güzel bir şekilde ışık tutuyor.
AdrienW

274

Bu çalışmalı

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;

verify(bar).DoStuff(any(Foo[].class));

31
Scala'da birisinin ihtiyacı olması durumunda:verify(bar).DoStuff(any[Array[Foo]])
tolitius

6
İthalatla ilgili bir sorunum vardı, ithalatımda hamcrest'ten herhangi bir () kullanıyordum ve mockito'dan biriyle çarpıştı.
Doppelganger

4
Lütfen API'ya bir göz atın, sınıf argümanı sadece döküm için kullanılır, yöntem hala her türlü nesneyi kabul eder! site.mockito.org/mockito/docs/current/org/mockito/… . Bu vaka sitesi için isA () kullanın . Mockito.org/mockito/docs/current/org/mockito/… .
thilko

1
Hamcrest ile isim çatışmasını önlemek için bu sınıf artık kullanılmıyor. Org.mockito.ArgumentMatchers kullanın
leo9r

12

Bunun için kullanabilirsiniz Mockito.isA():

import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.verify;

verify(bar).doStuff(isA(Foo[].class));

http://site.mockito.org/mockito/docs/current/org/mockito/Matchers.html#isA(java.lang.Class)


Bu doğru cevap. Herhangi bir (Clazz) kullanmak tamamen yanlıştır.
Surasin Tancharoen

3
@SurasinTancharoen Aslında, herhangi bir (Sınıf) sadece isA (Sınıf) 'ın takma adıdır (belgelere bakın). Yani hiç de yanlış değil.
jmiserez

8

En son projem için bu özelliği kullanmam gerektiğinden (bir noktada 1.10.19'dan güncelledik), sadece kullanıcıları (zaten mockito-core 2.1.0 veya daha yeni sürümünü kullanıyor ) güncel tutmak için, statik Yukarıdaki cevaplardan yöntemler ArgumentMatcherssınıftan alınmalıdır :

import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.any;

Mockito eserlerinizi muhtemelen sürüm 3'ten başlayarak güncel tutmayı planlıyorsanız, bu sınıf artık mevcut olmayabilir:

2.1.0 ve üzeri gibi org.mockito Javadoc'u.

Kullanın org.mockito.ArgumentMatchers. Bu sınıf, Hamcrest * org.hamcrest.Matchers sınıfıyla isim çakışmasını önlemek için artık kullanımdan kaldırıldı . Bu sınıf muhtemelen 3.0 sürümünde kaldırılacaktır.

Daha fazla okumaya hazırsanız mockito joker karakterleri hakkında küçük bir makale yazdım .


Scala'da org.mockito.ArgumentMatcher'ı nasıl alabilirim? İçe aktarmayı denedim org.mockito.ArgumentMatcher.any Hata alıyorum `değer herhangi bir nesnenin üyesi değil org.mockito.ArgumentMatcher
Manu Chadha

3.0 sürümündeki eşdeğerinin ne olduğunu söyler misiniz?
Manu Chadha

Bir kez yayınlanacağını bileceğiz;)
Maciej Kowalski
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.