gpt4 book ai didi

java - 模拟 CGLIB 增强对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:13:43 25 4
gpt4 key购买 nike

mockito 真的不能模拟已经被 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(); 时,它实际上调用了真正的函数。仔细观察 articleMock 得到了两次增强。 autowiring 的第一个原因和 spying 的第二个原因。

如果我不能监视增强对象,那么我如何在我的集成测试中测试 getArticle() 方法,以便我可以验证是否返回了正确的 DTO。

注意:我实际上不想测试执行文件系统调用的方法。只是数据库的。这就是为什么我需要测试 getArticle 方法。

最佳答案

如果我理解正确的话,你的类是由 Spring 连接的。 Spring 使用 CGLIB 来确保只有在没有接口(interface)的情况下才会有事务行为,接口(interface)是由你的对象实现的。如果有接口(interface),它使用简单的 JDK 动态代理。 (参见 http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch08s06.html)

也许你可以尝试提取一个接口(interface),让Spring使用动态代理。也许 Mockito 可以表现得更好。

关于java - 模拟 CGLIB 增强对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19734175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com