【问题标题】:How can I inject mocks into a bean that requires constructor arguments如何将模拟注入需要构造函数参数的 bean
【发布时间】:2021-02-09 16:05:20
【问题描述】:

我有一个原型 spring bean,它有一些注入的依赖项,也有一些构造函数参数。

public BeanA {

  @Inject private BeanB beanB;

  private String arg;

  public BeanA(String arg) {
    this.arg = arg;
  }

public void methodToTest() {
  // ...
  // ...
  // ...
  }

}

我想对这个类进行单元测试,模拟我注入的BeanB

通常,我会使用 @InjectMocksBeanA 中开始我的模拟。

我怎样才能做到这一点?到目前为止,我不想在构造函数中注入 BeanB,因为它会混合业务参数和依赖项。

【问题讨论】:

    标签: java spring junit mockito


    【解决方案1】:

    为什么将字段注入和构造函数注入混合在一起?我根本不推荐现场注入,特别是因为它们很难进行单元测试。 如果您想混合注射剂,也许这会有所帮助:

    Spring: unit test for class that has both field & constructor injection

    或者您可以使用反射将模拟的BeanB 设置为 BeanA

    Set private field value with reflection

    【讨论】:

    • 我正在混合字段注入和构造函数注入,因为我的原型 bean 存储状态(出于性能目的)。因此,我的构造函数参数与业务相关,并且我的字段注入连接了我的依赖项以使其工作。有意义吗?
    • 不错!我从春天开始使用 ReflectionTestUtils 设置私有字段。
    【解决方案2】:

    Spring 有一个ReflectionTestUtils,可用于将模拟注入字段。

    @ExtendWith(MockitoExtension.class)
    class BeanATest {
    
      private BeanA beanA;
    
      @Mock private BeanB beanB;
    
      void setUp(String arg) {
        beanA = new BeanA(arg);
        ReflectionTestUtils.setField(beanA, "beanB", beanB);
      }
    
      @Test
      void test() {
        String arg = "arg";
        setUp(arg);
    
        // ...
        beanA.methodToTest();
        // ...
      }
    
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-26
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 2019-03-10
      • 2018-11-02
      相关资源
      最近更新 更多