[英]How to mock only one dependency of test class in spring
我有一個 class,它有很多依賴項。
@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
來測試這個 class 的catch block
。
所以下面是我的測試,我模擬dependencyB
並在dependencyB.methodB();
時拋出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
注入。 如何解決這個問題? 正如我提到的,這個 class 有很多依賴項,我不能模擬每個。 要求只是模擬dependencyB.methodB();
這是財產注入受到傷害的情況之一。
更改TestClass
以使用構造函數注入。 然后你可以自己在測試中實例化它並注入你想要的任何東西。
您必須將所有依賴項定義為模擬,而不僅僅是 DependencyB,因此 Mockito 可以進行注入。 即使您不模擬他們的方法,這樣,您的TestClass 中也不會有 null 字段。
@Mock
private DependencyA dependencyA;
@Mock
private DependencyB dependencyB;
@Mock
private DependencyC dependencyC;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.