簡體   English   中英

如何在 spring 中僅模擬測試 class 的一個依賴項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM