Java Junit模拟私有方法

Java 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

我需要模拟私有方法,并且应该返回true。在ServiceImpl-execute()中,我的请求将转到else{},它将调用“eventRequest()”。 它是一个私有布尔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());
    }
}
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)时,请看一下这个。可能重复