java - 当存在来自父类(super class)的依赖注入(inject)时,如何设置测试?

标签 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;
   }
}

现在我想为 myController 编写测试。在测试中,我想使用注入(inject)的Store,但我想模拟出Validator。 我尝试过这样的事情。

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

   @Before
   public void before() {
      myController = new MyController(validator);
   }
}

我知道,如果我将 Store storeBaseController 移动到 MyController,我可以在构造函数中初始化它(就像我为验证者做了)。但是,我希望在 Base 类中有 Store,因为它将被其他扩展它的类使用。

根据我的类设置方式,如何在测试时注入(inject) Store

最佳答案

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

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;
   }
}

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

Spring @Autowire on Properties vs Constructor

Dependency Injection: Field Injection vs Constructor Injection?

同样值得注意的是

The Spring team generally advocates constructor injection

Source

关于java - 当存在来自父类(super class)的依赖注入(inject)时,如何设置测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59614345/

相关文章:

java - ORA-28040 : No matching authentication protocol Oracle

java - Hibernate - 选择 OneColumn 并以列表形式获取结果

java - 测试 Spring Boot Rest API Post 方法

java - Jacoco 报告显示已删除的 Java 类以进行测试覆盖

unit-testing - NestJS 模拟返回 Guard 的 Mixin

java - Google Guice 与 JSR-299 CDI/Weld

java - 从 View 中将空字符串作为 null 插入 MySQL DB 中

java - Android - 从数组动态更改 ImageView

java - JUnit:如何提供公开我的所有方法以便进行测试

java - 如何注入(inject)或替换@Resource 依赖项?