如何模拟调用从受保护资源继承的接口
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
}
我有以下代码结构
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
}