我面临着模拟没有引用的方法的数据的问题,例如getMethod();不知道模拟框架将如何知道它。下面是我遇到问题的代码无法在我的代码中设置HttpRequest和URIInfo。
是否可以绕过该方法。
Class A {
private HttpServletRequest httpRequest;
private UriInfo uriInfo;
public HttpServletRequest getReq() {
return httpRequest;
}
public void setReq(HttpServletRequest req) {
this.httpRequest = req;
}
public UriInfo getUriInfo() {
return uriInfo;
}
public void setUriInfo(UriInfo uriInfo) {
this.uriInfo = uriInfo;
}}
class B extends A {
// some code
}
class C extends B {
protected Object executeCall(Object beIn) throws Exception{
prepareUpdateConfigurationRequest();
// some other methods.
return "";
}
private void prepareUpdateConfigurationRequest() {
implPutCustomerProductOrderIdProductConfigurationsImpl.setReq(getReq());
implPutCustomerProductOrderIdProductConfigurationsImpl.setUriInfo(getUriInfo());
}}
//使用Mockito Framework测试类
@RunWith(MockitoJUnitRunner.class)
public class CTest {
@Mock
private A a = Mockito.mock(A.class);
@InjectMocks
private C c = new C();
private ImplBackEndInput implBackEndInput;
@Test
public void testExecuteCallObject() {
implBackEndInput = new ImplBackEndInput();
UriInfo uriInfo = Mockito.mock(UriInfo.class);
Mockito.when(a.getUriInfo()).thenReturn(uriInfo);
Mockito.when(a.getReq()).thenReturn(httpServletRequest);
try {
c.executeCall(implBackEndInput);
} catch (Exception e) {
}
}
}
答案 0 :(得分:0)
使用Mockito无法模拟受保护或私有方法,我建议如果你使用spring在你的测试包中创建一个DummyC类,在springConfig中引用它作为父类,并在调用时返回对象。通过这种方式,类将使用该方法作为您不需要测试的真实类的旁路。
答案 1 :(得分:0)
我不确定你的代码是如何编译的,给出了对非静态方法的静态引用 - A.getUriInfo()
- 以及其他各种错误。你使用getter为同一个对象调用setter也没有多大意义:
implPutCustomerProductOrderIdProductConfigurationsImpl.setReq(getReq());
implPutCustomerProductOrderIdProductConfigurationsImpl.setUriInfo(getUriInfo());
但是要回答那些可能会在这里结束的其他人的问题,你根本不需要在测试类中嘲笑A类型(这里):
Mockito.when(A.getUriInfo()).thenReturn(uriInfo);
Mockito.when(A.getReq()).thenReturn(httpServletRequest);
你根本不需要那两条线。实际上,您可以完全删除A
的模拟(此行):@Mock private A a = Mockito.mock(A.class);
相反,只需:
c.setUriInfo(uriInfo);
c.setReq(httpServletRequest);
这是因为C扩展了A,这意味着所有A的方法在没有被覆盖的情况下都由C继承。因此,如果在C的实例上调用非重写的setter方法,它将直接转到A的方法。在调用上面显示的set方法后,当您调用c.getUriInfo()
时,它会将您传入的对象作为参数返回到setUriInfo(uriInfo);
方法。这里根本不需要嘲笑。