当存在来自超类的依赖注入时,如何设置测试?

gan*_*rey 3 java junit dependency-injection mocking

我的代码是这样设置的。

abstract class BaseController {
   @Inject Store store; 
}

class MyController extends BaseController {
   private final Validator validator;

   @Inject
   public MyController(Validator validator) {
      this.validator = validator;
   }

   public boolean someMethod() {
      a = store.storingMethod();
      b = validator.validate(a);
      ...
      ...
      return true;
   }
}
Run Code Online (Sandbox Code Playgroud)

现在我想为myController. 在测试中,我想使用注入的Store但我想模拟Validator. 我试过这样的事情。

@RunWith(MockitoJUnitRunner.class)
public class MyControllerTest() {
   private MyController myController;
   @Mock private Validator validator;

   @Before
   public void before() {
      myController = new MyController(validator);
   }
}
Run Code Online (Sandbox Code Playgroud)

我知道,如果我Store storeBaseControllerto移动MyController,我可以在构造函数中初始化它(就像我对验证器所做的那样)。但是,我希望在 Base 类中有 Store,因为它会被其他扩展它的类使用。

根据我的课程设置方式,如何Store在测试时注入?

Mic*_*ael 5

不要使用字段注入。使用构造函数注入。

abstract class BaseController {
    final Store store; 

    BaseController(Store store) {
        this.store = store;
    }
}

class MyController extends BaseController {
   private final Validator validator;

   @Inject
   public MyController(Validator validator, Store store) {
      super(store);
      this.validator = validator;
   }
}
Run Code Online (Sandbox Code Playgroud)

关于这个主题有一些争论,但是您的示例清楚地说明了使用字段注入使类更难测试的情况。

Spring @Autowire 关于属性 vs 构造函数

依赖注入:字段注入 vs 构造函数注入?

还值得注意的是

Spring团队普遍提倡构造函数注入

来源