在InjectMock创建之前调用setUp方法

时间:2018-08-17 04:51:04

标签: java unit-testing mockito

我正在开发一个旧版应用程序,该应用程序将2个DI上下文保留在同一应用程序中,我想使用具有私人依赖项的Mockito测试一个类。 我要测试的类是在guice上下文中,guice上下文具有spring上下文作为已注册的bean,并且该类如下所示:

@Singleton
public class A {
   @Autowired
   private B b;

   @Inject
   public A(ApplicationContext applicationContext) {
      applicationContext.getAutowireCapableBeanFactory().autowireBean(this);
   }

   //OTHER METHODS

}

当我尝试像这样进行测试时,它会抛出空指针异常,因为安装方法是在创建类A时执行的,并且getAutowireCapableBeanFactory()在构造函数中返回null,并在此方法上调用一个方法会抛出空指针异常。 / p>

@RunWith(MockitoJUnitRunner.class)
public class ATest {

   @Mock
   private B b;

   @Mock
   private ApplicationContext applicationContext;

   @InjectMocks
   private A a;

   @Before
   public void setUp() throws Exception {
      when(applicationContext.getAutowireCapableBeanFactory()).thenReturn( mock(AutowireCapableBeanFactory.class));
   }
}

请提出解决此问题的任何方法或解决方法。

1 个答案:

答案 0 :(得分:0)

因为看起来您正在使用构造函数注入。您可以利用它来显式地连接自己的模拟(而不是依赖于依赖注入框架)

@RunWith(MockitoJUnitRunner.class)
public class ATest {

    private ApplicationContext applicationContext = mock(ApplicationContext.class);

    private A a = new A(applicationContext);

    @Before
    public void setUp() throws Exception {
        when(applicationContext.getAutowireCapableBeanFactory()).thenReturn( mock(AutowireCapableBeanFactory.class));
    }
}

另一方面,在实践中,田间注射似乎不受欢迎。设置A以使用构造函数注入甚至不是解决方法,而是朝着正确方向迈出的一步。

@Singleton
public class A {

    private B b;

    @Inject
    public A(ApplicationContext applicationContext, B b) {
      this.b = b;
      applicationContext.getAutowireCapableBeanFactory().autowireBean(this);

    }

}