【发布时间】:2019-08-10 15:26:13
【问题描述】:
我尝试使用weld-junit5 模拟一个类。 我嘲笑这门课,因为我想知道它多久会被调用一次。
但每次我尝试 Mockito.verify() 这个模拟类时,它都会抛出“NotAMockException”
Intellij 调试器正在验证该字段为:"Mock for MessageService, hashCode: XY"
我已经尝试将我的测试类添加到 WeldInitiator 中,但它不想工作。
“MessageService”是一个真正的类,而不是一个接口(接口也不起作用)
@EnableWeld
class GameServiceTest {
@WeldSetup
public WeldInitiator weld = WeldInitiator.from(GameService.class, GameCache.class,
/** Some More **/,
GameServiceTest.class).build();
@Produces
@ApplicationScoped
public MessageService createMessageServiceMock() {
return mock(MessageService.class);
}
@Inject
private MessageService messageService;
@Inject
private GameService gameService;
@Test
void handleRunningGames() {
this.gameService.handleRunningGames(null, mock(Session.class));
// This will throw a org.mockito.exceptions.misusing.NotAMockException
Mockito.verify(messageService, Mockito.times(1)).writeMessage(any(), any());
}
}
我希望 Injected MessageService 是一个真正的模拟,我可以在其上调用每个 Mockito 函数,但似乎并非如此。
我有什么问题吗,或者这样做的正确方法是什么?
我想我刚刚解决了这个问题:
private static final MessageService messageService = mock(MessageService.class);
@Produces
@ApplicationScoped
public MessageService createMessageServiceMock() {
return messageService;
}
【问题讨论】:
-
问题是
weld将东西包装到代理对象中。您可以使用answer中提到的解决方案,但这很丑。 -
我猜你最好不要在单元测试中使用
CDI/weld来测试你的类,而是使用mockito的@Mock和@InjectMocks注解注入依赖项. -
谢谢@second 我发现这似乎不是进行测试的最佳方式,但目前还可以。我添加了我的解决方案。
-
请阅读stackoverflow.com/help/tagging 并记住它以备将来的问题(我删除了前导标签)
标签: java mockito cdi weld-junit5