我正在开发一个旧版应用程序,该应用程序将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));
}
}
请提出解决此问题的任何方法或解决方法。
答案 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);
}
}