簡體   English   中英

存根具有泛型類參數的方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM