关于java:测试扩展另一个类的抽象类

Test abstract class which extends another class

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

1
2
3
4
5
6
7
8
9
10
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()调用实际方法,但convert方法不可用于mocking(通过t mockito.when(…)。然后返回(…),因为它受到保护。

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

告诉我如何测试foo方法。


Mockito不能模拟抽象类。但是您可以有一个子类来实现您的类B,然后监视它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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;
        }  
    }
}

使用这种方法,您可以轻松地模拟抽象方法,并在抽象类中测试非抽象方法。当然,缺点是必须装入一个伪测试类,该类是抽象类的子类型。但我认为这不应该是个大问题。