Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试扩展另一个类的抽象类_Java_Unit Testing_Mocking_Mockito - Fatal编程技术网

Java 测试扩展另一个类的抽象类

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

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

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的副本