从单元测试中注入模拟Spring @Autowired依赖项的最佳方法是什么?

Dan*_*iuc 16 java spring dependency-injection mocking autowired

import org.springframework.beans.factory.annotation.Autowired;

class MyService {
  @Autowired private DependencyOne dependencyOne;
  @Autowired private DependencyTwo dependencyTwo;

  public void doSomething(){
    //Does something with dependencies
  }
}
Run Code Online (Sandbox Code Playgroud)

在测试这个类时,我基本上有四种注入模拟依赖项的方法:

  1. 在测试中使用Spring的ReflectionTestUtils来注入依赖项
  2. 向MyService添加构造函数
  3. 将setter方法添加到MyService
  4. 放宽对包受保护的依赖性可见性并直接设置字段

哪个最好,为什么?

---更新---

我想我应该更清楚一点 - 我只是谈论"单元"样式测试,而不是Spring"集成"样式测试,其中依赖关系可以使用Spring上下文连接.

Boz*_*zho 20

使用ReflectionTestUtils或放置一个二传手.要么没事.添加构造函数可能会产生副作用(例如,不允许通过CGLIB进行子类化),仅仅为了测试而放宽可见性并不是一个好方法.

  • 这通常也是我最终做的事(ReflectionTestUtils).在我看来,这是Spring中为数不多的主要弱点之一,缺乏对直接在上下文中轻松替换/模拟bean的支持. (2认同)
  • setters :)因为它们是设置依赖关系的常规方式.Spring使用字段反射来做到这一点,但它可能是一个使用setter反射(bean属性) (2认同)