如何模拟对从受保护资源继承的接口的调用

时间:2017-07-21 18:44:50

标签: java unit-testing junit mocking powermock

我有以下代码结构

pkg a
public class TypeA {

@Resource
protected Resource resource

//other members and methods


}

pkg a
public class TypeB extends TypeA {

public void doSomething() {
  resource.methodCall();
 }

}

我正在尝试使用powermockito为mockB编写单元测试,为方法doSomething()编写mockito。我需要模拟对resource.methodCall()的调用,但不知道该怎么做。 目前无法更改TypeA或TypeB的代码

2 个答案:

答案 0 :(得分:1)

这里有三个选项:

  • 当然你会找到一些方法来注入一个模拟的ressource对象(例如Mockito有一个@InjectMocks注释,它使用反射来填充带有模拟对象的字段)。或者你创建一个帮助构造函数来将模拟器放到它的位置
  • 你可以看看允许部分嘲笑的Mockito间谍概念
  • 你重新设计你的设计,以便更容易测试(例如,通过交换继承与有利于组成的良好理由)

答案 1 :(得分:1)

如果您有不同的软件包,我建议使用getResource()方法在测试中覆盖:

pkg a
public class TypeA {
    @Resource
    protected Resource resource

    // for unit tests only
    public Resource getResource() {
        return resource;
    }
}

pkg a
public class TypeB extends TypeA {
    public void doSomething() {
      getResource().methodCall();
    }
}

在测试中,您覆盖getResource()方法以返回模拟实例:

@Test
public void testDoSomething() {
    Resource mockedResource = Mockito.mock(Resource.class);

    TypeB typeB = new TypeB() {
        @Override
        Resource getResource() {
            return mockedResource;
        }
    }

    typeB.doSomething();

    // verify what you need
}