2017-04-25 77 views
0

我有一些單元測試我的驗證方法的問題。這是我的方法:單元測試基本驗證

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.String中

顯示java.lang.NullPointerException (String.java:566) 在com.example.local.app_android.Authentification。 basic.Auth(Authentification.java:96) at com.example.local.app_android.AuthentificationTest.basicAuth(AuthentificationTest.java:34) /.../ at java.lang.reflect.Method.invoke(Method.java: 498) 在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' 
+0

你可以只是做一些調試來找出什麼是空的。但提示 - 嘲弄某事意味着它的任何方法都不會做任何事情...... –

+0

看來我的錯誤來自「basicAuth =」Basic「+ new String(Base64.encode(basicAuth.getBytes(),Base64)。NO_WRAP));「 我真的不是專家;是否意味着我不應該使用模擬? 因爲當我不這樣做時,它不起作用 –

回答

0

其實你缺少想到這麼:

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

返回NULL,這解釋了爲什麼字符串的構造函數拋出NPE。

你也應該看看文檔,特別是因爲你應該使用回放,當您使用模擬驗證,你是不是(這意味着你是不是測試了嘲笑的稱呼):https://github.com/powermock/powermock/wiki/MockStatic

1

真正的答案是:你不應該寫代碼是如此艱難,你需要PowerMock,以測試它。

含義:通過使用static,您創建了難以測試的代碼。相反:學習如何編寫易於測試的代碼(例如,開始here)。

然後重構你的代碼,以避免靜態調用;例如通過將encode()方法封裝到一個小封裝接口中(您仍然可以使用這些靜態方法來實現接口)。

如上所述;真正的答案是避免嘲笑靜態調用;從而避免了PowerMock的需要。除此之外;用PowerMock嘲諷靜態調用可以正常工作;您只需按照PowerMock人員所述的精確recipe

而且要清楚這一點:你仍然需要研究你的解決方案的確切細節;正如用戶Charlesworth已經預測到你的代碼中存在下一個NPE問題(並且他通常是現貨)。

+0

同意這一點但請注意,即使OP遵循此建議,他們的測試代碼仍然會拋出一個NPE。 –

+0

我也同意你的觀點,我的代碼並不是真的「乾淨」,這是我的第一個真正的項目,但現在我已經沒有時間了,我必須繼續這是我第一次遇到一個「模擬」 –

+0

@OliverCharlesworth給了你評論的功勞;-) – GhostCat