2 回答
TA贡献1772条经验 获得超5个赞
如果您只是想捕获参数并以某种方式处理/验证它们,请不要使用 doAnswer。Mockito 有一个定义的功能,称为ArgumentCaptor专为此而设计。通过使用它,您将不需要像您那样与 void 方法讨价还价:
@Mock private MessageProducer messageProducer;
@Captor private ArgumentCaptor<Event> eventCaptor;
@Captor private ArgumentCaptor<Long> longCaptor;
@InjectMocks
private MigrationRequestServiceImpl migrationRequestService;
@Test
public void sendRetriggerRequest() throws Exception {
// When
migrationRequestService.retriggerRequest(emsRetriggerRequest);
// Then
verify(messageProducer).sendMessage(eventCaptor.capture(), longCaptor.capture());
Event e = eventCaptor().getValue();
Long l = longCaptor().getValue();
}
TA贡献1825条经验 获得超6个赞
实际上我不想对参数做任何事情,我只需要跳过这个方法调用。我只是将 doAnswer 与一些伪代码一起使用,因为 doNothing() 或 doThrow() 不适用于此方法。
但是我能够解决这个问题。被注入 Mocks (MigrationRequestServiceImpl) 的类的自动装配组件 (eventsConfigProperties) 之一没有在测试类中被模拟!感谢@daniu 指出这一点。
来自 Mockito 的堆栈跟踪对调试问题不是很有帮助,它只是在方法调用时给出了一个空指针异常,这让我认为可能还有其他问题!
为这个错误道歉,我的错,但谢谢你,很高兴知道 ArgumentCaptor,未来测试可能需要它!
必须添加这个自动连接到 MigrationRequestService 类中的条目。
// Test class
@RunWith(MockitoJUnitRunner.class)
public class RetriggerRequestTest {
@Autowired
EventsConfigProperties eventsConfigProperties;
// Other declarations
}
添加回答
举报