unit-testing - 基于Consumer功能接口(interface)的单元测试回调

标签 unit-testing mockito functional-interface

我正在尝试对在 Consumer 功能接口(interface)中作为回调运行的代码进行单元测试。

@Component
class SomeClass {

  @Autowired
  private SomeInteface toBeMockedDependency;

  public method() {
     toBeMockedDependency.doSomething(message -> {
        // Logic under test goes here 
        //             (implements java.util.function.Consumer interface)
        ...
     });
  }
}

@RunWith(MockitoJUnitRunner.class)
public class SomeClassTest {
  @InjectMocks
  private SomeClass someClass;
  @Mock
  private SomeInteface toBeMockedDependency;

  @Test
  public void testMethod() {
    ...
    someClass.method();
    ...
  }
}

本质上,我想通过“toBeMockedDependency”向测试代码提供一些经过测试的“消息”。

如何模拟“toBeMockedDependency”以提供预定义的消息?
这是正确的方法吗?

最佳答案

不要试图制造 toBeMockedDependency自动调用您的功能接口(interface)。相反,使用 @Captorcapture匿名函数式接口(interface),然后使用您的测试手动调用它。

@RunWith(MockitoJUnitRunner.class)
public class SomeClassTest {
  @InjectMocks
  private SomeClass someClass;
  @Mock
  private SomeInteface toBeMockedDependency;
  @Captor
  private ArgumentCaptor<Consumer<Message>> messageConsumerCaptor;

  @Test
  public void testMethod() {
    someClass.method();
    verify(toBeMockedDependency).doSomething(messageConsumerCaptor.capture());
    Consumer<Message> messageConsumer = messageConsumerCaptor.getValue();

    // Now you have your message consumer, so you can test it all you want.
    messageConsumer.accept(new Message(...));
    assertEquals(...);
  }
}

关于unit-testing - 基于Consumer功能接口(interface)的单元测试回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39017627/

相关文章:

java - 测试 URL 和 URLConnection

Java 函数式接口(interface)和 Lambda 表达式

java - 使用Callable代替Supplier,反之亦然

angular - 具有模拟服务的单元测试组件 - 错误

Java Mockito : How to prepare different answers

unit-testing - 在 Jest 中编写单元测试时预期会出现特定错误

java - 如何对创建新对象的类进行单元测试

java - 对功能 (SAM) 接口(interface)变量使用属性 getter 方法引用

c# - 带有 Action<T> 参数的模拟方法

java - 使用 MockRestServiceServer 测试 HttpRequestExecutingMessageHandler