测试扩展另一个类

时间:2017-12-20 14:09:21

标签: java unit-testing mocking mockito

我有一个抽象类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。

1 个答案:

答案 0 :(得分:1)

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;
        }  
    }
}

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