gpt4 book ai didi

java - stub 具有通用类参数的方法

转载 作者:行者123 更新时间:2023-11-30 10:56:25 25 4
gpt4 key购买 nike

我正在尝试 stub 以下类:

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);
}
}

我想在两种消息的测试中有两个 stub 。这是 stub 代码:

@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.

显然,第二个 stub 覆盖了第一个 stub 。

深入isA() 代码并调试显示,内部泛型在 stub /调用/编译过程中丢失。挠我的脑后,我似乎想起了一些关于 Java 无法像那样处理内部泛型的事情。

所以我尝试用argThat() stubbing factory,如下,但是结果还是和上面一样的错误。

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);

有什么方法可以实现我想要的 stub 和验证。如果可以,如何实现?

最佳答案

问题出在不正确的匹配器中:

isA(ThisMessageType.class.getClass())

替换为

eq(ThisMessageType.class)

参见 matchers api了解详情。

关于java - stub 具有通用类参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33018776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com