[英]How do you write a java unit test of a class method that does not return a value?
我是 Java 单元测试的新手,需要帮助编写一个单元测试,该单元测试只需要处理方法没有返回值的“if”语句的 2 个路径。
public class Consumer extends KafkaConsumer {
private final MessageService service;
public Consumer(MessageService service) {
this.service = service;
}
@Override
protected void processRecords(ConsumerRecords<Long, String> records) {
for (ConsumerRecord<Long, String> records) {
if (record.value().startsWith("{")) {
OldFormatMessageObject mo = new OldFormatMessageObject(record.value());
service.processMessage(mo);
} else if (record.value().startsWith("metadata")) {
NewFormatMessageObject mo = new NewFormatMessageObject(record.value());
service.processMessage(mo);
}
}
}
严格来说,分支逻辑实际上有 3 条路径可以测试:
startsWith("{")
则调用MessageService#processMessage(OldFormatMessageObject)
。startsWith("metadata")
则调用MessageService#processMessage(NewFormatMessageObject)
。 如果“迭代”逻辑也经过单元测试( for
循环),那就太好了。
我们必须验证是否调用了正确的MessageService
方法。
为此,我们可以使用MessageService
mock,它将通过构造函数注入到Consumer
。
使用 mockito [1],它可能看起来像这样:
...
@Mock
private MessageService messageServiceMock;
// Tested instance
private Consumer consumer;
@BeforeEach
public void beforeEach() {
consumer = new Consumer(messageServiceMock);
}
@Test
public void newMessageFormatIsHandled() {
// Given
final String expectedValue = "my-expected-value";
// When
consumer.processRecords(testSingleConsumerRecords(expectedValue));
// Then
verify(messageServiceMock, times(1)).processMessage(new NewFormatMessageObject(expectedValue));
// OR
verify(messageServiceMock, times(1)).processMessage(isA(NewFormatMessageObject.class));
}
...
请注意,如果MessageService
有接口,您甚至不需要任何模拟框架,并为您的单元测试用例提供“模拟”实例,但模拟框架使测试更具可读性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.