如何使用Mockito框架验证单元测试中的内部代理调用?
我正在尝试为doAllTasks()
方法编写测试,并验证doSingleTask()
被调用了一定次数。显然我不能将我的服务分成两部分,因为这些方法具有相同的含义。最简单的解决方案是添加setProxy()
方法,但缺点是我需要在服务定义中添加与测试相关的代码。有任何想法吗?
@Service
public class XXXServiceImpl implements XXXService, BeanNameAware {
private String name;
private XXXService proxy;
@Autowired
private ApplicationContext applicationContext;
@Override
public void setBeanName(String name) {
this.name = name;
}
@PostConstruct
public void postConstruct() {
proxy = (XXXService)applicationContext.getBean(name);
}
@Transactional
public void doAllTasks(){
for(...)
proxy.doSingleTask(...);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSingleTask(...){
}
}
答案 0 :(得分:2)
解决此问题的一种简单方法是为代理添加setter并使用简单模拟覆盖单元测试中的字段。如果您还添加了一个getter,则可以在测试后将其恢复。
主要缺点是这会阻止您并行运行测试,除非您为此测试创建新的ApplicationContext
。
另一种方法是给字段@Qualifier
,这样您就可以在测试配置中定义两个不同的bean。在制作中,你只需返回单身。
答案 1 :(得分:0)
ApplicationContext
的模拟。getBean
兜售,以返回XXXService
doSingleTask
已调用