【问题标题】:How to test a method which requires an external rest call?如何测试需要外部休息调用的方法?
【发布时间】:2017-03-26 06:43:31
【问题描述】:

我想对一种通过外部访问管理基础架构登录用户的方法进行单元测试。我不知道如何模拟 Response response 对象。

这是我打算测试的代码:

public String login(final String username, final String password) {
    String baseUrl = getOpenAMApiBaseUrl();
    String path = "/openam/json/authenticate";

    // Response NEEDS TO BE MOCKED SOMEHOW
    Response response = jaxClient.target(baseUrl + path)
            .request(MediaType.APPLICATION_JSON_TYPE)
            .header(HttpHeaderField.OPENAM_USERNAME, username)
            .header(HttpHeaderField.OPENAM_PASSWORD, password)
            .post(Entity.json(null));

    int status = response.getStatus();
    String jsonResponse = response.readEntity(String.class);

    if (status == Response.Status.OK.getStatusCode()) {
        try (JsonReader jsonReader = Json.createReader(new StringReader(jsonResponse))) {
            JsonObject jsonObject = jsonReader.readObject();
            String token = jsonObject.getString("tokenId");
            LOGGER.info("{} have successfully logged in", username);
            return token;
        } catch (NullPointerException e) {
            LOGGER.info("login failed, invalid json response for {}/{}", username, password);
            return null;
        }
    }

    String message = "an error occurred during logging in, http status: {}, user: {}/{}";
    if (status == Response.Status.UNAUTHORIZED.getStatusCode()) {
        message = "invalid credentials, http status: {}, user: {}/{}";
    }
    LOGGER.info(message, status, username, password);
    return null;
}

【问题讨论】:

  • 你有什么尝试吗?如果是,代码在哪里?
  • 我什么都没有,因为我不知道如何模拟外部休息调用。
  • 是什么阻止你阅读 Mockito 教程并尝试?到目前为止,您只放弃了要求...

标签: java unit-testing junit mocking mockito


【解决方案1】:

理想情况下,您必须模拟从 jaxClient.target 方法开始的所有调用,但在这种情况下,由于生成模拟所需的链很长,我建议您选择以下两个选项之一:

1)(首选) - 将 Response 的创建提取到一个新类中,该类只专注于该特定操作。

然后,您将该类声明为被测类的依赖项,并简单地注入它的模拟,并使用配置为返回某个 Response 对象的构建器方法。

2) 您可以在您的类中创建一个包级方法,如下所示:

Response buildResponse(){
    String baseUrl = getOpenAMApiBaseUrl();
    String path = "/openam/json/authenticate";

    // Response NEEDS TO BE MOCKED SOMEHOW
    Response response = jaxClient.target(baseUrl + path)
            .request(MediaType.APPLICATION_JSON_TYPE)
            .header(HttpHeaderField.OPENAM_USERNAME, username)
            .header(HttpHeaderField.OPENAM_PASSWORD, password)
            .post(Entity.json(null));
}

然后@Spy 您正在测试的类并模拟该方法以返回您想要的响应:

@Spy
ClassUnderTest classUnderTest;

@Mock
Response responseMock;

@Before
public void init(){
    MockitoAnnotations.initMocks(this);
}

@Test
public void test(){
    doReturn(responseMock).when(classUnderTest).buildResponse();

    // Act

    classUnderTest.login(login,pass);

   // Assertions
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2012-08-28
    • 1970-01-01
    • 2013-08-18
    • 2019-10-25
    相关资源
    最近更新 更多