簡體   English   中英

在Mockito嵌套嘲笑

[英]Nested mocking in Mockito

我有這個Mockito代碼:

interface Dao {
    public void doSomething();
}

class LegacyClass {
    Dao dao;

    public String legacyMethod() {
        dao.doSomething();
        return "Test";
    }
}

public class MockitoTest {
    public static void main(String[] args) {
        Dao dao = mock(Dao.class);
        LegacyClass legacyInst = new LegacyClass();
        legacyInst.dao = dao;
        LegacyClass legacy = spy(legacyInst);

        when(legacy.legacyMethod()).thenReturn("Replacement");
    }
}

最后一個when()拋出以下異常:

Exception in thread "main" org.mockito.exceptions.base.MockitoException: 
'doSomething' is a *void method* and it *cannot* be stubbed with a *return value*!
Voids are usually stubbed with Throwables:
    doThrow(exception).when(mock).someVoidMethod();
If the method you are trying to stub is *overloaded* then make sure you are calling the right overloaded version.
    at mypkg.MockitoTest.main(MockitoTest.java:28)

但是,我Dao.doSomethingDao.doSomething嘲笑返回值,而是為了LegacyClass.legacyMethod()

這是預期的行為嗎? 是否有任何Mockito文件聲明你不能像這樣嵌套嘲笑?

我該怎么走這個?

間諜不這樣做。 在您的示例代碼中,真正的方法legacy.legacyMethod()實際上被調用,因為它是間諜而不是模擬(然后調用dao.doSomething() ),這就是您收到此錯誤的原因。

如果你想進行局部模擬,你必須把它寫成:

doReturn("Replacement").when(legacy).legacyMethod();

這樣Mockito就會知道你想要進行局部模擬,所以它不會調用真正的方法。

暫無
暫無

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

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