如何在spring中只模拟测试类的一个依赖项



我有一个类,它有很多依赖项。

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

相关内容

最新更新