【发布时间】:2013-11-01 19:39:12
【问题描述】:
mockito 真的不能 mock 已经被 CGLIB 增强的对象吗?
public class Article {
@Autowired
private dbRequestHandler
@Autowired
private filesystemRequestHandler
@Transactional
public ArticleDTO getArticleContents() {
//extractText() and then save the data in DTO
//extractImages() and then save the data in DTO
// some other calls to other databases to save data in dto
return articleDTO;
}
public void extractText() {
//call to DB
}
public void extractImages() {
// call to file system
}
}
public class IntegrationTest {
@Autowired
private Article article;
//setup method {
articleMock = Mockito.spy(article);
doNothing().when(articleMock).extractImages();
}
}
在上面的例子中,当涉及到doNothing().when(articleMock).extractImages(); 时,它实际上调用了真正的函数。仔细看看文章 Mock 得到了两次增强。 autowiring 的一个原因和spying 的第二个原因。
如果我无法监视增强的对象,那么如何在我的集成测试中测试 getArticle() 方法,以便我可以验证是否返回了正确的 DTO。
注意:我实际上不想测试执行文件系统调用的方法。只是数据库。这就是为什么我需要测试getArticle 方法。
【问题讨论】:
-
按照我对documentation 的发现,我没有模仿地看到问题所在。您是否尝试过自己创建
Article,但没有自动装配(或至少在自动装配后验证正确性)? -
是的,如果我自己创建
Article,我就可以进行间谍活动。但我必须自动装配它,因为在我的应用程序中,每个对象都是通过自动装配创建的,如果我自己启动Article,那么 Article 类中的字段为空(例如 reqHandler 对象)。如果我也启动这些字段,那么这些类中的字段为空,并且链继续.. -
过滤后的代码和您的问题不适合 - 有问题的
getArticle(),代码中的getArticleContents()- 这会造成一些混乱。您应该考虑提供更多IntegrationTest代码。 -
实际上,我们需要更多的
IntegrationTest代码才能了解发生了什么。
标签: java mocking integration-testing mockito cglib