使用Mockito测试抽象类

255

我想测试一个抽象类。当然,我可以手动编写一个继承该类的模拟

我能否使用一个mocking框架(我正在使用Mockito)来代替手工制作我的mock?如何操作?


6
从Mockito [1.10.12](http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#30)开始,Mockito直接支持对抽象类进行监视/模拟:`SomeAbstract spy = spy(SomeAbstract.class);` - pesche
15
从Mockito 2.7.14开始,你也可以通过mock(MyAbstractClass.class, withSettings().useConstructor(arg1, arg2).defaultAnswer(CALLS_REAL_METHODS))来模拟需要构造函数参数的抽象类。 - Gediminas Rimsa
12个回答

1
你可以实例化一个匿名类,注入你的模拟对象,然后测试该类。
@RunWith(MockitoJUnitRunner.class)
public class ClassUnderTest_Test {

    private ClassUnderTest classUnderTest;

    @Mock
    MyDependencyService myDependencyService;

    @Before
    public void setUp() throws Exception {
        this.classUnderTest = getInstance();
    }

    private ClassUnderTest getInstance() {
        return new ClassUnderTest() {

            private ClassUnderTest init(
                    MyDependencyService myDependencyService
            ) {
                this.myDependencyService = myDependencyService;
                return this;
            }

            @Override
            protected void myMethodToTest() {
                return super.myMethodToTest();
            }
        }.init(myDependencyService);
    }
}

请记住,抽象类 ClassUnderTest 的属性 myDependencyService 的可见性必须为protected

0

在这种情况下,PowerMock的Whitebox.invokeMethod(..)非常方便。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接