繁体   English   中英

如何编写不返回值的 class 方法的 java 单元测试?

[英]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 条路径可以测试:

  1. 如果startsWith("{")则调用MessageService#processMessage(OldFormatMessageObject)
  2. 如果startsWith("metadata")则调用MessageService#processMessage(NewFormatMessageObject)
  3. 否则什么也不会发生。

如果“迭代”逻辑也经过单元测试( 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有接口,您甚至不需要任何模拟框架,并为您的单元测试用例提供“模拟”实例,但模拟框架使测试更具可读性。


[1] https://site.mockito.org

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM