Junit 模拟私有方法

Junit Mocking Private Method

我需要模拟私有方法并且应该 return 为真。在 ServiceImpl-execute() 中,我的请求将转到 else { },它将调用 "eventRequest()"。 它是一个私有布尔 eventRequest(),所以每当 evenRequest() 调用时,我都应该 return 为真。谁能帮帮我

ServiceImplTest.java

@RunWith(PowerMockRunner.class)
@PrepareForTest({ServiceImpl.class})
public class ServiceImplTest {

    @Test
    public void testExecute() {
        Response response = serviceImpl.execute(request);
        Assert.assertNotNull(pushResponse);
        Assert.assertEquals(true, pushResponse.isIsSuccess());
    }
}

ServiceImpl.java

public class ServiceImpl {
    public Response execute(Request request) {
        Response response = null;
                boolean isSuccess;
                if (returnMockResponse(request, notifyRqst)) {
                    isSuccess = true;
                } else {
                    isSuccess = eventRequest(notifyXmlRqst);
                }
        response = ResponseBuilder.createResponse(isSuccess);
        return response;
    }

    // Need to mock below private method and should return true.
    private boolean eventRequest(String request) throws Exception {
        return eventNotifyResponse.isIsSuccess();
    }
}

ResponseBuilder.java

public class ResponseBuilder {
    public Response createResponse(boolean result) {
            Response response = new Response();
            response.setIsSuccess(result);
            return response;
    }    
}

在jUnit或者jMock中默认是不可以的,你可以把private改成public或者调用内部调用private方法的public方法,确保输入导致私有方法被调用和覆盖。

您是否尝试过使用 PowerMock.createPartialMock(ClassWithPrivateMethod.class, "nameOfTheMethodToMock")PowerMock.expectPrivate(mockObject, "nameOfTheMethodToMock", argument1, argument2) 作为 wiki off powermock 中的描述?

https://code.google.com/p/powermock/wiki/MockPrivate

或者可能会看到这个问题的答案...

How to mock private method for testing using PowerMock?

您可以正常创建 eventNotifyResponse 的模拟,然后使用 Whitebox 设置私有(内部)字段。

假设您的字段 eventNotifyResponse 属于名为 EventNotifyResponse 的类型,测试 class 它将类似于:

    EventNotifyResponse evtNotifyResponseMock = mock(EventNotifyResponse.class);
    when(evtNotifyResponseMock.isIsSuccess()).thenReturn(true);
    Whitebox.setInternalState(serviceImpl, "eventNotifyResponse", evtNotifyResponseMock);

Whitebox 是 Powermock (org.powermock.reflect.Whitebox) 的 class。
setInternalState 过载。在示例中,使用的参数是:

  1. 要注入的目标对象(您正在测试的对象)
  2. 要设置的内部字段的名称(字符串)
  3. 值本身,在本例中是模拟值