【问题标题】:Test abstract class which extends another class测试扩展另一个类的抽象类
【发布时间】:2017-12-20 14:09:20
【问题描述】:

我有一个抽象类 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() 来调用真实方法,但 convert 方法不可用于模拟(通过 Mockito.when (...).thenReturn (...) 因为它受到保护。

B b = Mockito.spy(B.class);

告诉我如何测试方法 foo。

【问题讨论】:

标签: java unit-testing mocking mockito


【解决方案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;
        }  
    }
}

使用这种方法,您可以轻松地模拟抽象方法并在抽象类中测试非抽象方法。当然,缺点是您必须创建一个伪造的测试类来子类型您的抽象类。但我认为这应该不是什么大问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    相关资源
    最近更新 更多