java - Junit 模拟私有(private)方法

标签 java junit mockito powermock powermockito

我需要模拟私有(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 已重载。示例中使用的参数为:

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

关于java - Junit 模拟私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31319173/

相关文章:

java - Play Framework 2.4 (Java) + Hibernate + JUnit : org. hibernate.engine.jdbc.spi.SqlExceptionHelper - 池已关闭

scala - 测试是否在不提供参数的情况下调用了方法

java - Android java.lang.RuntimeException : Unable to instantiate activity ComponentInfo com. aksitrewari.gateexampreparation.MyActivity

java - JSONAssert.assertEquals : Ignoring multiple fields when comparing

java - 多个 Swingbuilder 实例?

java - 如何组织单元和集成测试?

android - 如何在android单元测试中模拟Resources类以获得scaledDensity?

java - 返回 Future<Void> 的调用在单元测试中抛出 NPE

java - 将 SQL 与 JAVA 代码分离

java - IntelliJ : Getting Spring+Gradle+JUnit project to work within IDE