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 过载。在示例中,使用的参数是:
- 要注入的目标对象(您正在测试的对象)
- 要设置的内部字段的名称(字符串)
- 值本身,在本例中是模拟值
我需要模拟私有方法并且应该 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 过载。在示例中,使用的参数是:
- 要注入的目标对象(您正在测试的对象)
- 要设置的内部字段的名称(字符串)
- 值本身,在本例中是模拟值