java在Mockito中验证内部代理调用
如何使用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(...){
}
}
# 1 楼答案
ApplicationContext
李>getBean
metood返回XXXService
的MockdoSingleTask
# 2 楼答案
解决这个问题的一个简单方法是为代理添加一个setter,并用一个简单的mock覆盖单元测试中的字段。如果您还添加了一个getter,那么可以在测试后恢复它
主要的缺点是,这会阻止您并行运行测试,除非您为此测试创建一个新的
ApplicationContext
另一种方法可能是给字段一个
@Qualifier
,这样就可以在测试的配置中定义两个不同的bean。在生产中,您只需返回singleton