簡體   English   中英

來自抽象類的超類的模擬字段

[英]Mocking field from super class from abstract class

我有一個抽象類:

public abstract MySuperEpicAbstractClass {
    @Autowired
    private IMessageWriter messageWriter;

    protected IMessageWriter getMessageWriter() {
        return messageWriter;
    }
}

public abstract class MyEpicAbstractClass extends MySuperEpicAbstractClass {
    //This class usses the getMessageWriter();
}

我的問題很簡單,我有一個測試MyEpicAbstractClassTest ,它將測試子類MyEpicAbstractClass ,那么如何從超類中模擬messageWriter呢?

如果可以在調用測試的地方添加測試代碼的一部分,那會很好。我認為您可以監視一個真實的對象,然后模擬其中的一種方法。 因此,對於具體的子類(A),您應該監視A的對象,然后模擬getMessageWriter()。 像這樣的東西。

ConcreteSubClass subclass = new ConcreteSubClass();
subclass  = Mockito.spy(subclass );
Mockito.doReturn(msgWriterObj).when(subclass).getMessageWriter();

或嘗試使用一些實用程序,例如ReflectionTestUtils。

盡管有很多方法可以做到這一點,但是“低技術”,“無框架”和“無重構”版本將只是在測試中將其分流。 它可能看起來像這樣:

public MyEpicAbstractClassTest {
    public void testThatNeedsTheFakeMessageWriter() {
        ShuntedMyEpicAbstractClass meac = new ShuntedMyEpicAbstractClass();

        meac.doSomething("Arguments");

        verify(meac.getMessageWriter()).write("Arguments");
    }
}

// And the shunt is here
public class ShuntedMyEpicAbstractClass extends MyEpicAbstractClass {
    private IMessageWriter stubbedWriter = Mockito.mock(IMessageWriter.class);

    public IMessageWriter getMessageWriter() {
       return stubbedWriter;
    }
}

當您不能像其他建議者那樣重構基類時,此技術通常很有用。

希望這可以幫助!

布蘭登

暫無
暫無

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

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