java - 如何验证某些内容是否作为某个执行程序的主体被调用?

标签 java unit-testing mockito

给出一些类的以下实现:

private Executor someSpecialExecutor;

private SomeService someService;

public void foo() {
    someSpecialExecutor.execute(() -> someService.bar());
}

假设 someSpecialExecutor 始终在当前线程中同步运行传递的可运行对象,如何验证当前在 中运行时调用 someService.bar() >someSpecialExecutor 而不是在它之外?

我知道我可以创建一个实现Runnable的类,并检查执行程序是否传递了该类的实例,并检查someService.bar()的调用在 Runnable 实现的测试中。但我想避免为此单一目的创建额外的类。

最佳答案

那么,您可以确保在测试中仅调用 someService.bar() 一次,这是 verify 的默认设置:

Mockito.verify(someService).bar();

如果多次调用就会失败。另一种更加确定的方法是模拟 executoreService 本身,然后使用 ArgumentCaptor

ArgumentCaptor<Runnable> captor = ArgumentCaptor.forClass(Runnable.class);
Mockito.verify(someSpecialExecutor).execute( captor.capture() );
Mockito.verify(someService, Mockito.never()).bar(); // nothing has been executed yet

Runnable runnable = captor.getValue(); // get the actual argument
runnable.run(); // execute the runnable 
Mockito.verify(someService).bar(); // now the lambda should have executed the method

通过这种方式,您可以模拟执行程序,然后检查执行方法是否被调用一次(而不实际执行某些操作)。此时,不应该调用 someService.bar() 方法。不,您获得传递给执行器的参数并执行它 - 现在 someService.bar() 应该被调用一次。

关于java - 如何验证某些内容是否作为某个执行程序的主体被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47409600/

相关文章:

javascript - 在 sinon 中 stub 整个类以进行测试

java - 使用 wiremock 时返回自定义异常

java - 如何将NetBeans项目从具有Maven的Java转换为纯Java?

java - 纹理不使用 lwjgl 和顶点缓冲区渲染

java - 将图像另存为 PNG

javascript - Sigma.js学习与实例

unit-testing - py.test 测试 Cython C API 模块

c# - TFS 构建测试结果

java - Runnable 的单元测试

scala - 如何在 Mockito 和 Scala 中使用隐式匹配器 stub 方法调用