测试扩展另一个类的抽象类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测试扩展另一个类的抽象类相关的知识,希望对你有一定的参考价值。

我有一个抽象类B,它扩展了另一个抽象类A.在抽象类A中,我有保护方法转换。我想测试方法foo,它从没有实现的基类调用方法转换。如果我无法更改转换方法签名,我如何模拟方法转换。

abstract class B extends A {
    public void foo(Object someObject) {
        Object convertedObject = convert(someObject);
        //logic for testing
    }
}

abstract class A {
    protected abstract Object convert(Object some object);      
}

我使用Mockito.spy()来调用实际方法,但转换方法不适用于模拟(通过Mockito.when(...)。thenReturn(...)因为它受到保护。

B b = Mockito.spy(B.class);

告诉我如何测试方法foo。

答案

Mockito不能模拟抽象类。但是你可以有一个子类用于你的测试目的,它实现你的类B然后监视它。

@RunWith(MockitoJUnitRunner.class)
public class BTest {

    @InjectMocks
    @Spy
    private FakeB b;

    @Test
    public void testSomething() {
        when(b.convert(any())).thenReturn(something);
    }

    public static class FakeB extends B {
        protected Object convert(Object someobject) {
            return null;
        }  
    }
}

使用这种方法,您可以轻松地模拟抽象方法并在抽象类中测试非抽象方法。当然,缺点是你需要创建一个假抽象类的子类。但我认为这应该不是一个大问题。

以上是关于测试扩展另一个类的抽象类的主要内容,如果未能解决你的问题,请参考以下文章

在另一个项目中包含继承类时抽象类的链接器错误

如何对扩展/继承第 3 方类的类进行单元测试

如何从同一个类中的另一个构造函数调用抽象类的构造函数(方法重载)[重复]

java 面向对象(封装 组合 抽象类 接口)封装组合

创建一个扩展抽象类的对象并将其添加到 Scala 中类型抽象类的序列中

扩展抽象类的类的类型是啥?