有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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(...){
  }
}

共 (2) 个答案

  1. # 1 楼答案

    1. 注入模拟的ApplicationContext
    2. MockgetBeanmetood返回XXXService的Mock
    3. 验证调用了doSingleTask
  2. # 2 楼答案

    解决这个问题的一个简单方法是为代理添加一个setter,并用一个简单的mock覆盖单元测试中的字段。如果您还添加了一个getter,那么可以在测试后恢复它

    主要的缺点是,这会阻止您并行运行测试,除非您为此测试创建一个新的ApplicationContext

    另一种方法可能是给字段一个@Qualifier,这样就可以在测试的配置中定义两个不同的bean。在生产中,您只需返回singleton