我有一个类,它有很多依赖项。
@Service
public class TestClass {
@Inject
private DependencyA dependencyA;
@Inject
private DependencyB dependencyB;
@Inject
private DependencyC dependencyC;
// .
// .
// .
// .
@Inject
private DependencyZ dependencyZ;
public boolean testMethod() {
try {
dependencyA.methodA();
dependencyB.methodB();
dependencyC.methodC();
dependencyD.methodD();
return true;
} catch (StaleObjectStateException e) {
return false;
}
}
}
现在,我想模拟其中一个依赖项,并抛出exception
来测试这个类的catch block
。
下面是我的测试,当dependencyB.methodB();
调用时,我模拟dependencyB
并抛出StaleObjectStateException
。
public class TestClassIT {
@InjectMocks
private TestClass testClass;
@InjectMocks
private CustomRuleEngine customRuleEngine;
@Mock
private DependencyB dependencyB;
@Before
public void init() {
MockitoAnnotations.initMocks(TestClass.class);
}
@Test
public void testOnSuccessRuleAfterCreate() throws Exception {
setupRequestContextWithFullPermission();
when(dependencyB.methodB(any())).thenThrow(new StaleObjectStateException("f", "f"));
// and expect exception.
}
}
然而,它不起作用,因为TestClass
的所有其他依赖项都作为null
注入。如何解决这个问题?正如我提到的,这个类有很多依赖项,我不能嘲笑每一个。要求只是模拟dependencyB.methodB();
这是属性注入造成伤害的情况之一。
将TestClass
更改为使用构造函数注入。然后,您可以自己在测试中实例化它,并注入您想要的任何内容。
您必须将所有依赖项定义为mock,而不仅仅是DependencyB,这样Mockito才能进行注入。即使你不模拟他们的方法,这样,你的TestClass中也不会有空字段。
@Mock
private DependencyA dependencyA;
@Mock
private DependencyB dependencyB;
@Mock
private DependencyC dependencyC;