繁体   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