Verwendung der Wrapper-Klasse.
Ich habe Testcode geschrieben und wollte die letzte Klasse verspotten, also habe ich sie zu einer Wrapper-Klasse gemacht. Ursprünglich war es eine Methode, die die letzte Klasse als Argument verwendete, aber da sie damit nicht getestet werden kann, habe ich beschlossen, das Argument als Wrapper-Klasse zu verwenden. Wäre das nicht passiert, wenn wir es von Anfang an als Probefahrt entwickelt hätten? .. .. schwer.
python
@Override
protected String doInBackground(URL... url) {
HttpURLConnection con = null;
URL urls = url[0];
try {
con = (HttpURLConnection)urls.openConnection();
con.setRequestMethod("GET");
con.connect();
int resCd = con.getResponseCode();
if (resCd != HttpURLConnection.HTTP_OK) {
throw new IOException("HTTP responseCode:" + resCd);
}
BufferedInputStream inputStream = new BufferedInputStream(con.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while (true) {
line = reader.readLine();
if (line == null) {
break;
}
mBuffer.append(line);
}
inputStream.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
con.disconnect();
}
return mBuffer.toString();
}
python
@Override
protected String doInBackground(URLWrapper... urlWrapper) {
HttpURLConnection con = null;
URLWrapper urls = urlWrapper[0];
try {
con = (HttpURLConnection)urls.openConnection();
con.setRequestMethod("GET");
con.connect();
int resCd = con.getResponseCode();
if (resCd != HttpURLConnection.HTTP_OK) {
throw new IOException("HTTP responseCode:" + resCd);
}
BufferedInputStream inputStream = new BufferedInputStream(con.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while (true) {
line = reader.readLine();
if (line == null) {
break;
}
mBuffer.append(line);
}
inputStream.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
con.disconnect();
}
return mBuffer.toString();
}
doInBackground ist eine Methode von AsyncTask. Es ist eine subtile Änderung, aber zuerst habe ich java.net.URL als Argument genommen, aber ich habe festgestellt, dass die URL eine endgültige Klasse ist und nicht verspottet werden kann, also habe ich sie in eine Wrapper-Klasse geändert. Ich habe auch versucht, PowerMockito zu verwenden, aber es hat nicht funktioniert, daher verwende ich dies vorerst. Jetzt können Sie den folgenden Testcode anwenden.
python
@Test
public void test_doInBackground(){
HttpURLConnection httpURLConnection = null;
try{
String rtnXml = "aaaaaaaaaaaa";
//HttpURLConnection verspotten
httpURLConnection = mock(HttpURLConnection.class);
when(httpURLConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_OK);
when(httpURLConnection.getInputStream()).thenReturn(new ByteArrayInputStream(rtnXml.getBytes("utf-8")));
//URLWrapper-Mock
URLWrapper urlWrapper = mock(URLWrapper.class);
when(urlWrapper.openConnection()).thenReturn(httpURLConnection);
//ConfirmAsyncListenerImpl mock
ConfirmAsyncListenerImpl confirmAsyncListener = mock(ConfirmAsyncListenerImpl.class);
// RestaurantAsync.doInBackground()Test von
RestaurantAsync restaurantAsync = new RestaurantAsync(confirmAsyncListener);
assertThat(restaurantAsync.doInBackground(urlWrapper), is("aaaaaaaaaaaa"));
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
httpURLConnection.disconnect();
}
}
Wenn ich versuche, java.net.URL zu verspotten, wird ein Kompilierungsfehler angezeigt, sodass ich feststellen kann, dass ich mit einer Wrapper-Klasse damit umgehen kann.
Die Wrapper-Klasse lautet übrigens wie folgt
URLWrapper.java
public class URLWrapper {
private final URL url;
public URLWrapper(URL url){
this.url = url;
}
public URLConnection openConnection(){
URLConnection urlConnection = null;
try {
urlConnection = this.url.openConnection();
}catch(IOException e){
e.printStackTrace();
}
return urlConnection;
}
}
Ich frage mich, ob es Unterschiede oder Nachteile gibt, wenn man das Argument in der letzten Klasse und in der Wrapper-Klasse nimmt. Ich werde es hinzufügen, wenn ich es wieder verstehe.
Ich werde es hinzufügen, wenn ich es wieder bemerke.
Recommended Posts