Java 测试扩展另一个类的抽象类
我有一个抽象类B,它扩展了另一个抽象类A。在抽象类A中,我有一个受保护的方法转换。我想测试方法foo,它从没有实现的基类调用方法convert。如果无法更改转换方法签名,如何模拟方法转换Java 测试扩展另一个类的抽象类,java,unit-testing,mocking,mockito,Java,Unit Testing,Mocking,Mockito,我有一个抽象类B,它扩展了另一个抽象类A。在抽象类A中,我有一个受保护的方法转换。我想测试方法foo,它从没有实现的基类调用方法convert。如果无法更改转换方法签名,如何模拟方法转换 abstract class B extends A { public void foo(Object someObject) { Object convertedObject = convert(someObject); //logic for testing
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方法不可用于模拟(通过Mockito.when(…)。然后返回(…),因为它受到保护
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;
}
}
}
使用这种方法,您可以轻松地模拟抽象方法并在抽象类中测试非抽象方法。当然,缺点是您必须包装一个虚假的测试类来对抽象类进行子类型化。但我认为这应该不是一个大问题。通过非抽象子类测试它。您需要一个B实例来测试它,但是您不能实例化B,因为它可能是您应该使用PowerMockito的副本