Mockito ArgumentCaptor用于可选参数

时间:2018-01-12 00:27:14

标签: java mockito

在accountHandler类中使用以下签名

的方法
public void processMessage(String accountId, 
Metrics metrics, 
Optional<ZonedDateTime> parsedDatetime) {

        // do something 
}

在测试中,如果我想使用参数捕获器,我该如何定义它?

尝试了以下操作,但没有按预期工作。

ArgumentCaptor<ZonedDateTime> timeCaptor = ArgumentCaptor.forClass(ZonedDateTime.class);

使用argcaptor使这个可选的语法是什么?

2 个答案:

答案 0 :(得分:3)

根据similar question,使用@Captor注释:

@Captor
private ArgumentCaptor<Optional<ZonedDateTime>> captor;

答案 1 :(得分:2)

以下案例适用于以下方法签名:

public void processMessage(Optional<ZonedDateTime> parsedDatetime) {

由于我不知道使用了哪个Meteric类,我也希望AccountHandler类存在。

@Test
@SuppressWarnings("unchecked")
public void withValue() {
    ArgumentCaptor<Optional<ZonedDateTime>> timeCaptor = ArgumentCaptor.forClass(Optional.class);
    AccountHandler accountHandler = mock(AccountHandler.class);

    Optional<ZonedDateTime> input = Optional.of(ZonedDateTime.now());
    accountHandler.processMessage(input);

    verify(accountHandler).processMessage(timeCaptor.capture());

    Optional<ZonedDateTime> optional = timeCaptor.getValue();
    assertTrue(optional.isPresent());
    assertNotNull(optional.get());
}

@Test
@SuppressWarnings("unchecked")
public void nullOptional() {
    ArgumentCaptor<Optional<ZonedDateTime>> timeCaptor = ArgumentCaptor.forClass(Optional.class);
    AccountHandler accountHandler = mock(AccountHandler.class);

    Optional<ZonedDateTime> input = null;
    accountHandler.processMessage(input);

    verify(accountHandler).processMessage(timeCaptor.capture());

    Optional<ZonedDateTime> optional = timeCaptor.getValue();
    assertNull(optional);
}