我需要模拟私有(private)方法并且应该返回true。在 ServiceImpl-execute() 中,我的请求将转到 else { } 并调用“eventRequest()”。 它是一个私有(private)的 boolean eventRequest(),所以每当 EvenRequest() 调用时我应该返回 true。谁能帮帮我
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;
}
}
最佳答案
您可以正常创建 eventNotifyResponse 的模拟,然后使用 Whitebox 设置私有(private)(内部)字段。
假设您的字段 eventNotifyResponse 属于名为 EventNotifyResponse 的类型,则测试类将类似于:
EventNotifyResponse evtNotifyResponseMock = mock(EventNotifyResponse.class);
when(evtNotifyResponseMock.isIsSuccess()).thenReturn(true);
Whitebox.setInternalState(serviceImpl, "eventNotifyResponse", evtNotifyResponseMock);
Whitebox是Powermock的一个类(org.powermock.reflect.Whitebox)。
setInternalState 已重载。示例中使用的参数为:
- 要注入(inject)的目标对象(正在测试的对象)
- 要设置的内部字段的名称(字符串)
- 值本身,在本例中是一个模拟
关于java - Junit 模拟私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31319173/