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

How to mock calls to an interface inherited from a protected resource

我有以下代码结构

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 为 Class TypeB 编写单元测试,mockito 用于方法 doSomething()。我需要模拟对 resource.methodCall() 的调用,但不知道该怎么做。 目前不能更改 TypeA 或 TypeB 的代码

这里有三个选项:

  • 自然地,您会寻找一些方法来 注入 模拟的资源对象(例如,Mockito 有一个 @InjectMocks 注释,它使用反射来用模拟对象填充字段)。或者你创建一个辅助构造函数来让那个模拟到它的位置
  • 您可以查看允许部分模拟的 Mockito 间谍概念
  • 您重新设计您的设计以使其更易于测试(例如,通过与有充分理由的偏爱组合交换继承)

如果你有不同的包,我建议使用 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() 方法重写为 return 模拟实例:

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