Mockito.any () pass Generics ile Arayüz


171

jenerikler ile bir arayüzün türünü geçmek mümkün mü?

Arayüz:

public interface AsyncCallback<T>

Test yöntemimde:

Mockito.any(AsyncCallback.class)

<ResponseX>Arkasına koymak ya da .classişe yaramadı.

Yanıtlar:


306

Bir tür güvenli yol vardır: ArgumentMatchers.any()bunu tür ile kullanın ve nitelendirin:

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

4
Bu cevabın işe yaradığını ve uyarıyı doğru şekilde bastırdığını onaylıyorum.
kevinarpe

1
Bu gerçekten daha güvenli değil, çünkü gerçek yöntem sadece doğru şekilde yazılmış argüman ile çağrılabilir. Sadece bu tür bir çıkarımdan yoksun java8 öncesi derleyiciyi tatmin etmek gerekiyordu.
Herman

ResponseEntity <List <Map <String, Object >>> responseEntity = Matchers gibi bir şey kullandım. <ResponseEntity <List <Map <String, Object >>>> any (); Ve her zaman null
Arun

6
Mockito'nun yeni sürümleri ile:(Matchers.<AsyncCallback<ResponseX>>any()
pierrefevrier

15
Matchersaslında kullanımdan kaldırıldı, ancak ArgumentMatchersişe yaradı.
guijob

67

Java 8'i kullanarak any(), gelişmiş tür çıkarımından dolayı argüman veya type parametresi olmadan (statik içe aktarma varsayarak) kullanabilirsiniz . Derleyici, hedef türden (yöntem bağımsız değişkeninin türü), aslında Matchers.<AsyncCallback<ResponseX>>any()Java 8 öncesi çözüm olan demek istediğinizi biliyor .


Olmaz any()maç AsyncCallback<AnyOtherType>yanı?
Matthew,

@MatthewRead AsyncCallback<AnyOtherType>Bağımsız değişken türü 'AsyncCallback <ResponseX>' olsa bile kullanma derlenmemelidir.
Herman

1
Argüman tipinin de genel olduğu bir durumu merak ediyorum, ancak sadece bir somut tip için alay etmek istiyorsunuz (veya farklı şekillerde birden fazla tip için alay etmek istiyorsunuz). Verilen when(x.y(any())).thenAnswer(...)örneğin, nerede yolduğunu public <T> T y(AsyncCallback<T> arg). Belki de cevabın türünü kontrol etmek daha iyi olurdu, eğer gerekli ise?
Matthew,

2
@MatthewRead Silme nedeniyle, gerçek tür çalışma zamanında Mockito tarafından kontrol edilemez. Yani kullanamazsın bile isA(). Nesne Classtüre karşılık gelen bir nesneyi tutarsa ve arabirim bunu ortaya çıkarırsa, sanırım özel bir eşleştiricide kontrol edebilirsiniz. Veya örneğin bir Collectionelemanın tipini kontrol edebilirsiniz.
Herman

1
Matchers, ArgumentMatchersMockito v2 ile değiştirildi
bheussler

15

Jeneriklere izin vermek için aşağıdaki mechamizmi benimsemek zorunda kaldım:

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

Umarım bu birine yardımcı olur.


3
Cevabımı gör: Java 8 ile artık gerekli değil.
Herman

5

Pierrefevrier yorumunu, cevaplar yerine bir cevapta mevcutsa yararlı olabilecek cevap olarak gönderme.

Mockito'nun yeni sürümleriyle: (Matchers.<AsyncCallback<ResponseX>>any()


1
Orijinal cevaba yaptığı yorumu ekledim
Joergi

2

ThSoft'un herhangi bir () yöntemine nitelikli çağrı koymak cevabına ek olarak, dönüş türü çıkarımına izin verdiğinden kalifikasyonu kaldırabileceğim anlamına geliyordu:

private HashMap<String, String> anyStringStringHashMap() {
    return Matchers.any();
}

0

İsterseniz sadece bastırıp uyarı ekleyerek yayınlayabilirsiniz:

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

Java 'jenerik' jeneriklere izin verdiyse, aradığınız yöntem bu şekilde olabilir

private static <T, E> T<E> mock(Class<T<E>> clazz)

Bunu denediğimde, You cannot use argument matchers outside of verification or stubbing.
testimde

Kullanmak için iyi bir fikir değil @SuppressWarnings: pre-java 8, eğer ayrı bir değişkene atayacak olsaydınız, sadece any()ıntoy'nin cevabında olduğu gibi kullanabilirsiniz . Şimdi java 8 ile, any()ayrı bir atamaya gerek kalmadan satır içi kullanılabilir.
Herman

@kevinarpe Birden fazla argüman eşleştiriciniz varsa, Java dilinin belirttiği şekilde çağrılmalıdır.
TWiStErRob

0

Spring'i kullanırken de benzer bir sorun yaşadım Example:

Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
            .thenReturn(Lists.emptyList());

Burada, yeterlilik kullanmak zorunda, b / c findAll yöntemi Sortve gibi birden fazla tür alabilir Iterable. Mockito.any(Example.class)Tabii ki tip güvenlik uyarısı ile de kullanabilirsiniz .

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.