首页 > 解决方案 > Mockito 测试 java 8 lambda Consumer API

问题描述

我需要使用 lambda Consumer 测试一个使用另一个接口作为依赖注入的类。

@Builder
public class Interactor {

    private final Gateway gateway;

    void process(String message, Consumer<String> response){
        gateway.process(message, uuid -> {
            response.accept(uuid.toString());
        });
    }
}

依赖项定义如下:

public interface Gateway {

    void process(String message, Consumer<UUID> uuid);
}

我将如何模拟网关,以便为我的测试提供 UUID 值响应?

这是我到目前为止所尝试的:

@Test
void whillReturnTheInjectedUUIDValueTest() {

    UUID uuid = UUID.randomUUID();

    Gateway gateway = Mockito.mock(Gateway.class);
    Mockito.when(gateway.process("ignored", uuid1 -> {return uuid;}));

    Interactor.builder().gateway(gateway).build().process("ignored", s -> {
        Assertions.assertEquals(uuid.toString(), s);
    });
}

我应该如何向消费者提供返回值?

标签: javalambdajunitmockito

解决方案


这个成功了

@Test
void willReturnTheInjectedUUIDValueTest() {

    UUID uuid = UUID.randomUUID();
    Gateway gateway = Mockito.mock(Gateway.class);

    doAnswer(ans -> {
        Consumer<UUID> callback = (Consumer<UUID>) ans.getArgument(1);
        callback.accept(uuid);
        return null;
    }).when(gateway).process(Mockito.any(String.class), Mockito.any(Consumer.class));

    Interactor.builder().gateway(gateway).build().process("ignored", s -> {
        Assertions.assertEquals(uuid.toString(), s);
    });
}

这个答案是提示-> https://stackoverflow.com/a/47226374/148397


推荐阅读