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