Java Junit模拟私有方法
我需要模拟私有方法,并且应该返回true。在ServiceImpl-execute()中,我的请求将转到else{},它将调用“eventRequest()”。 它是一个私有布尔eventRequest(),因此每当evenRequest()调用时,我都应该返回true。有人能帮我吗 ServiceImplTest.javaJava Junit模拟私有方法,java,junit,mockito,powermock,powermockito,Java,Junit,Mockito,Powermock,Powermockito,我需要模拟私有方法,并且应该返回true。在ServiceImpl-execute()中,我的请求将转到else{},它将调用“eventRequest()”。 它是一个私有布尔eventRequest(),因此每当evenRequest()调用时,我都应该返回true。有人能帮我吗 ServiceImplTest.java @RunWith(PowerMockRunner.class) @PrepareForTest({ServiceImpl.class}) public class Serv
@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());
}
}
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();
}
}
public class ResponseBuilder {
public Response createResponse(boolean result) {
Response response = new Response();
response.setIsSuccess(result);
return response;
}
}
ServiceImpl.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());
}
}
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();
}
}
public class ResponseBuilder {
public Response createResponse(boolean result) {
Response response = new Response();
response.setIsSuccess(result);
return response;
}
}
ResponseBuilder.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());
}
}
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();
}
}
public class ResponseBuilder {
public Response createResponse(boolean result) {
Response response = new Response();
response.setIsSuccess(result);
return response;
}
}
默认情况下,在jUnit或jMock中是不可能的,您可以将private更改为public,也可以调用在内部调用private方法的public方法,并确保输入导致调用和覆盖private方法。您尝试过
PowerMock.createPartialMock(ClassWithPrivateMethod.class,“NameOfMethodToMock”)
和PowerMock.expectPrivate(mockObject,“NameOfMethodToMock”,argument1,argument2)
如关闭PowerMock的wiki中所述
或者也许看到这个问题的答案
您可以正常创建eventNotifyResponse的模拟,然后使用Whitebox设置私有(内部)字段 假设您的字段eventNotifyResponse是名为eventNotifyResponse的类型,则它的测试类类似于:
EventNotifyResponse evtNotifyResponseMock = mock(EventNotifyResponse.class);
when(evtNotifyResponseMock.isIsSuccess()).thenReturn(true);
Whitebox.setInternalState(serviceImpl, "eventNotifyResponse", evtNotifyResponseMock);
Whitebox是Powermock的一个类(org.Powermock.reflect.Whitebox)。setInternalState重载。在示例中,使用的参数为:
不要模拟私有方法。在调用isIsSuccess()时,只需模拟eventNotifyResponse以返回true。另外,为什么要将未使用的字符串传递给该方法?对该字符串进行一些条件检查,以便我传递字符串。@Manu,我们不能这样做,因为在调用eventNotifyResponse.IsSuccess()之前;我们还有一些代码来验证其他一些逻辑,但我想跳过这些代码并返回true,当我们调用eventRequest(notifyXmlRqst)时,请看一下这个。可能重复