簡體   English   中英

嵌套方法在Mockito中嘲弄

[英]Nested method mocking in Mockito

我有以下Java類:

public class A
{
    @Autowired
    private B b;
    public int aFn()
    {
        int something = b.bFn();
    }
}
public class B
{
    @Autowired
    private C c;
    public int bFn()
    {
        int something = c.cFn();
    }
}
public class C
{
    public int cFn()
    {
        return 231;
    }
}

以下測試使用Mockito測試上面的代碼:

public class test
{
    @Autowired
    private A a;

    private C c;

    @Test
    public void testA()
    {
        c = mock(C.class);
        when(c.cFn(),anyInt()).thenReturn(something);
        assertEquals(0, a.aFn());
    }
}

當我調試testA時,我發現真正的c.Cfn()被執行,而不是被模擬的。 我在這里做錯了什么嗎? 請幫忙!

首先,您應該始終模擬對象的直接依賴關系,而不是它的傳遞依賴關系。 所以你應該模擬B而不是C來測試A.然后你會通過模擬C來編寫B的單元測試。

第二:你不是在單元測試中的任何地方注入模擬。 你應該擁有的是:

public class Test {

    // not autowired here
    private A a;

    private B mockB;

    @Test
    public void testA() {
        mockB = mock(B.class);
        when(b.bFn(), anyInt()).thenReturn(something);

        // the missing part: injecting the mock into the tested object
        a = new A(mockB);
        // or a = new A();
        //    a.setB(mockB);

        assertEquals(0, a.aFn());
    }
}

當你使用mock(B.class)時,你得到一個B的模擬實例。這並不意味着B的所有其他實例都會做模擬所做的事情。

模擬C來測試A是一種不好的做法:單元測試應該測試一個類而不是其他類。 但是如果你真的想要它,那么創建一個模擬C,創建一個B並在其中注入模擬C,然后創建一個A並在其中注入B。

A --> B --> mockC

忘記你想要模擬的是直接的還是嵌套的。 從Spring的哲學觀點來看它。

你基本上想要做的是模擬一個bean。

在您的情況下,您必須使用@MockBean注釋為類c模擬bean。

@RunWith(SpringRunner.class)
public class Test {
...
@MockBean private C c;
...
}

有關詳細信息,請參閱此文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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