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