[英]Stub a method with a generic class argument
我正在嘗試存根以下課程:
public class MyFactory {
...
public Publisher getPublisher(String arg1, String arg2, Class<? extends QueueMessage> msgClass) {
do the magic...
}
}
這是Publisher
類的(簡短版本):
public class Publisher <M extends QueueMessage> {
public void publish(M message) throws IOException {
publish(message);
}
}
我想在我的測試中有兩個存根來處理兩種消息。 這是存根代碼:
@Mock
private Factory factory;
@Mock
protected ThisMessagePublisher<ThisMessageType> thisMessagePublisher;
@Mock
protected ThatMessagePublisher<ThatMessageType> thatMessagePublisher;
when(factory.getPublisher(anyString(), anyString(), isA(ThisMessageType.class.getClass()))).thenReturn(thisMessagePublisher);
when(factory.getPublisher(anyString(), anyString(), isA(ThatMessageType.class.getClass()))).thenReturn(thatMessagePublisher);
它編譯正確。
然后我嘗試調用工廠和兩個發布者,希望為每個發布者驗證一個調用。
Publisher thisPublisher = factory.getPublisher("arg1", "arg2", ThisMessageType.class);
thisPublisher.publish(new ThisMessageType("Message"));
Publisher thatPublisher = factory.getPublisher("arg1", "arg2", ThatMessageType.class);
thatPublisher.publish(new ThatMessageType("Message"));
verify(thisPublisher).publish(Matchers.<ThisMessageType>any());
verify(thatPublisher).publish(Matchers.<ThatMessageType>any());
測試失敗並出現以下錯誤:
Wanted but not invoked:
thisPublisher.publish(
<any>
);
-> at ...
Actually, there were zero interactions with this mock.
顯然,第二個存根覆蓋了第一個存根。
深入isA()
代碼和調試表明,內部泛型在存根/調用/編譯過程中丟失了。 撓我的腦后,我似乎想起了一些關於 Java 無法處理這樣的內部泛型的事情。
所以我嘗試用argThat()
存根工廠,如下所示,但結果是與上面相同的錯誤。
when(Factory.getPublisher(anyString(), anyString(), argThat(new CustomTypeSafeMatcher<Class<ThisMessageType>>("Is class of ThisMessageType") {
@Override
protected boolean matchesSafely(Class<ThisMessageType> aClass) {
return aClass != null;
}
}))).thenReturn(thisPublisher);
when(Factory.getPublisher(anyString(), anyString(), argThat(new CustomTypeSafeMatcher<Class<ThatMessageType>>("Is class of ThatMessageType") {
@Override
protected boolean matchesSafely(Class<ThatMessageType> aClass) {
return aClass != null;
}
}))).thenReturn(thatPublisher);
有什么方法可以實現我想要的存根和驗證。 如果是這樣,怎么做?
問題出在不正確的匹配器中:
isA(ThisMessageType.class.getClass())
將其替換為
eq(ThisMessageType.class)
有關詳細信息,請參閱匹配器 api 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.