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

问题描述 投票:1回答:1

我有一个抽象类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。

java unit-testing mocking mockito
1个回答
1
投票

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;
        }  
    }
}

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

© www.soinside.com 2019 - 2024. All rights reserved.