【发布时间】: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