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方法。
- 通过非抽象的子类测试它。您需要B的一个实例来测试它,但是由于B是抽象的,所以不能实例化它。
- 如何单元测试抽象类的可能副本:用存根扩展?
- 你应该使用powermockito
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;
}
}
} |
使用这种方法,您可以轻松地模拟抽象方法,并在抽象类中测试非抽象方法。当然,缺点是必须装入一个伪测试类,该类是抽象类的子类型。但我认为这不应该是个大问题。