Mockito.any () Generics ile Arayüzü Geçiş

Bir arayüzün türünü jeneriklerle geçmek mümkün mü?

Arayüz:

public interface AsyncCallback

Test yöntemimde:

Mockito.any(AsyncCallback.class)

Putting behind or for .class didnt work.

106

6 cevap

Tip güvenli bir yol var: ArgumentMatchers.any() komutunu kullanın ve bunu türüyle nitelendirin:

ArgumentMatchers.>any()

yorumlarda bahsettiğimiz pierrefevrier, Mockito'nun yeni versiyonları ile

Matchers.>any()
205
katma
Bu gerçekten daha güvenli değildir çünkü gerçek yöntem sadece doğru yazılmış argümanı ile çağrılabilir. Bu tür bir tür çıkarımdan yoksun olan pre-java8 derleyicisini karşılamak için gerekliydi.
katma yazar herman, kaynak
Bu gibi bir şey kullandım ResponseEntity >> responseEntity = Eşleştiriciler. >>> any (); Ve her zaman null değerini döndürür
katma yazar Arun, kaynak
Bu cevabın çalıştığını ve uyarıyı doğru şekilde bastırdığını doğrularım.
katma yazar kevinarpe, kaynak
Eşleştiriciler aslında kullanımdan kaldırıldı, ancak ArgumentMatchers işe yaradı.
katma yazar guijob, kaynak
ArgumentMatchers kullanan ilk kişi benim için çalıştı ve ikincisi ise Matchers'ı kullanarak kullanımdan kaldırıldı. ResponseX'in ne olduğu konusunda bir kafa karışıklığım vardı. Ancak cevabı kendim aldım, benim durumumda şöyle yazdım: ArgumentMatchers. <�Şartname <�Çağrı >> any ()
katma yazar Barani r, kaynak
Mockito'nun yeni sürümleriyle: (Matchers. > any()
katma yazar pierrefevrier, kaynak

Using Java 8, you can simply use any() (assuming static import) without argument or type parameter because of enhanced type inference. The compiler now knows from the target type (the type of the method argument) that you actually mean Matchers.>any(), which is the pre-Java 8 solution.

47
katma
@MatthewRead AsyncCallback kullanarak argüman türü 'AsyncCallback ' ise derlenmemelidir.
katma yazar herman, kaynak
@MatthewRead Silme nedeniyle, gerçek tip çalışma zamanında Mockito tarafından kontrol edilemez. Yani isA() kullanamazsınız. Nesne, türe karşılık gelen Class nesnesine sahipse ve arabirim bunu ortaya çıkarırsa, sanırım özel bir eşleştiricide kontrol edebilirsiniz. Ya da örneğin Collection durumunda, elemanların tipini kontrol edebilirsiniz.
katma yazar herman, kaynak
Matchers , Mockito v2'de ArgumentMatchers ile değiştirildi
katma yazar bheussler, kaynak
herhangi bir() AsyncCallback ile eşleşmez mi?
katma yazar Matthew Read, kaynak
Ben argüman türünün genel olduğu bir durum hakkında merak ediyorum, ama sadece bir beton türü (veya farklı şekillerde birden fazla tür için alay etmek) ile alay etmek istiyorum. (xy (any ())) .soner (…) öğesinin verildiğinde y public T y (AsyncCallback arg) . Belki de, eğer ihtiyaç duyulursa, cevabın tipini kontrol etmek daha iyi olur mu?
katma yazar Matthew Read, kaynak
Ah, tamamen haklısın. Aslında sadece tip silme hakkında daha çok şey okumuştum ve bir nedenden dolayı buna bağlanmadı. Açıkladığın için teşekkürler!
katma yazar Matthew Read, kaynak

Jeneriklere izin vermek için aşağıdaki mecmuru kabul etmeliydim:

import static org.mockito.Matchers.any;
List list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);

Umarım bu birisine yardım eder.

11
katma
Cevabımı görün: Bu artık Java 8 ile gerekli değil.
katma yazar herman, kaynak

Pierrefevrier'e yorum yapmak, yorumlar yerine bir cevapta mevcutsa faydalı olabilecek bir cevap olarak yorumda bulunur.

With new versions of Mockito: (Matchers.>any()

3
katma
yorumunu orijinal cevaba ekledim
katma yazar Joerg, kaynak

İsterseniz, bastırma uyarıları ekleyerek yalnızca yayınlayabilirsiniz:

@SuppressWarnings("unchecked")    
AsyncCallback callback = Mockito.any(AsyncCallback.class)

Java 'jenerik' jeneriklere izin verdiyse, aradığınız şey bu gibi bir yönteme sahip olabilir.

private static  T mock(Class> clazz)
1
katma
@SuppressWarnings 'i kullanmak iyi bir fikir değil: pre-java 8, eğer bunu ayrı bir değişkene atayacak olsaydınız, sadece any() ' ı Cevap. Şimdi java 8 ile, any() , ayrı bir atamaya gerek kalmadan satır içi kullanılabilir.
katma yazar herman, kaynak
Bunu denediğimde, testimde bir hatayla karşılaştım: Doğrulama eşleştirmelerini doğrulama veya saplama dışında kullanamazsınız.
katma yazar kevinarpe, kaynak
Birden çok argüman eşleştiriciniz varsa Kevinarpe, Java dili belirttikçe sırayla çağrılmalıdır.
katma yazar TWiStErRob, kaynak

ThSoft'un cevabı, kalifiye aramayı herhangi bir() yöntemine koyma, geri dönüş türüne izin verilen çıkarımdan beri kalifikasyonu kaldırabilirdi:

private HashMap anyStringStringHashMap() {
    return Matchers.any();
}
0
katma