单元测试基本授权
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
我在对身份验证方法进行单元测试时遇到了一些问题。这是我的方法:
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