【问题标题】:Mockito's mock not works in a runnableMockito 的模拟不适用于可运行文件
【发布时间】:2017-05-08 13:39:38
【问题描述】:

我在 Spring Boot 中使用 mockito。在Runnable 中使用模拟对象时,我发现存根不起作用。

这是代码示例:

@Component
public class TheClassIWantTest {
    @Autowired
    private ADependency aDependency;

    @Autowired
    private ThreadPoolTaskExecutor executor;

    public void theMethodIWantTest {
        executor.execute(new Runnable() {
            @Override
            public void run() {
                Integer result = aDependency.doSomething();  // result should be 111, but it's null
            }
        })
    }
} 

单元测试:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class)
@FixMethodOrder(value = MethodSorters.NAME_ASCENDING)
public class TheTest {

    @Autowired
    private TheClassIWantTest theClassIWantTest;

    @MockBean
    private ADependency aDependency;

    @Test
    public void testTheMethod() {
        Ingeter testResult = 1;
        when(aDependency.doSomething()).thenReturn(111);  // this stub doesn't work...

        theClassIWantTest.theMethodIWantTest();
    }
}

我原以为aDependency.doSomething() 会返回111,因为我在测试用例中定义了存根,但result 为空。

如果我删除

的行
    executor.execute(new Runnable() {
        @Override
        public void run() {

要将异步可运行方法转换为普通同步方法,存根运行良好,例如result == 111

这让我觉得存根在可运行文件中不再起作用。

我该如何解决这个问题?或者有什么解决方法?

谢谢!

【问题讨论】:

  • 你在哪里检查你的测试结果?为什么你调用这个方法(或者为什么它返回一个整数),因为你没有对结果做任何事情?
  • @JBNizet 代码示例是对真实业务逻辑的高度抽象。在实际业务逻辑中,aDependency.doSomething() 将向一个远程服务发出 http 请求。根据这个远程调用的结果,一些关键的日志会被打印到离线分析日志文件中,我的测试用例会验证这些日志条目。
  • 问题是您已经删除了太多代码(生产和测试),以至于它不再有意义。发布一个完整的最小示例来重现问题。

标签: java spring unit-testing spring-boot mockito


【解决方案1】:

您是否考虑过您的测试实际上可能比您的 Runnable 运行得更快?执行程序服务被要求运行 Runnable 代码,并将在一个单独的线程中执行此操作(取自 ThreadPool)。同时,您的测试类继续在主线程上。您可能想查看https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html,这将允许您暂停测试代码,直到您的业务代码在您的闩锁上倒计时。请注意,您正在修改业务代码以适应测试。单元测试多线程代码绝非易事...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多