如何使用Mockito模拟我的超类的方法

时间:2015-09-24 17:36:31

标签: java unit-testing mockito

我面临着模拟没有引用的方法的数据的问题,例如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) {
    }

}
}

2 个答案:

答案 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);方法。这里根本不需要嘲笑。

相关问题