单元测试基本授权

Unit testing basic auth

我在对身份验证方法进行单元测试时遇到了一些问题。这是我的方法:

    public int basicAuth(String username, String password) throws IOException {
    connection = (HttpURLConnection)new URL("URL").openConnection();
    connection.setRequestMethod("GET");
    String basicAuth = username + ":" + password;
    String wrap = "Basic " + new String(Base64.encode(basicAuth.getBytes(),Base64.NO_WRAP));
    connection.setRequestProperty("Authorization",basicAuth);
    connection.connect();
    //InputStream in = connection.getInputStream();
    int response = connection.getResponseCode();
    Log.v("Reponse HTTP : ", String.valueOf(response));
    responseCode_ = connection.getResponseCode();
    return responseCode_;
}

这是我的测试代码:

@Test
public void basicAuth() throws Exception {
    PowerMockito.mockStatic(Base64.class);
    String username = "username";
    String password = "password";
    int responseCode = 200;
    int integer = auth.basicAuth(username, password);
    assertEquals(responseCode, integer);
}

我正在使用 Powermock,因为我有一个 Base64 错误,它没有被模拟。现在,当我使用 Powermock 时出现此错误:

java.lang.NullPointerException at java.lang.String.(String.java:566) at com.example.local.app_android.Authentification.basicAuth(Authentification.java:96) at com.example.local.app_android.AuthentificationTest.basicAuth(AuthentificationTest.java:34) /.../ at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

(我已经把中间的错误切掉了)

有人知道错误的来源吗?

编辑 N°1

testCompile 'org.powermock:powermock-api-mockito:1.6.1'
testCompile 'org.powermock:powermock-module-junit4-rule-agent:1.6.1'
testCompile 'org.powermock:powermock-module-junit4-rule:1.6.1'
testCompile 'org.powermock:powermock-module-junit4:1.6.1'
testCompile 'org.mockito:mockito-core:1.10.19'

真正的答案是:您不应该编写太难以至于需要 PowerMock 来测试它的代码。

含义:通过使用 static,您创建了难以测试的代码。相反:学习如何编写易于测试的代码(例如开始 here)。

然后重构你的代码,避免静态调用;例如,通过将 encode() 方法包装到一个微型包装器接口中(顺便说一句,您仍然可以使用那些静态方法来实现该接口)。

如前所述;真正的答案是避免模拟静态调用;从而避免对 PowerMock 的需要。除此之外;使用 PowerMock 模拟静态调用效果很好;您只需完全按照 PowerMock 人员概述的 recipe 进行操作即可。

要明确一点:您仍然需要查看解决方案的具体细节;因为用户 Charlesworth 已经预测了您代码中的下一个 NPE 问题(而且他通常是正确的)。

实际上你错过了期望所以:

Base64.encode(basicAuth.getBytes(),Base64.NO_WRAP)

Return null,这解释了为什么 String 的构造函数抛出 NPE。

您还应该查看文档,尤其是因为您应该在使用模拟时使用重放和验证,而您没有使用(这意味着您没有测试模拟被调用):https://github.com/powermock/powermock/wiki/MockStatic