Comment utiliser la classe wrapper.
J'écrivais du code de test et je voulais me moquer de la classe finale, alors j'en ai fait une classe wrapper. À l'origine, c'était une méthode qui prenait la classe finale comme argument, mais comme elle ne peut pas être testée avec cela, j'ai décidé de prendre l'argument comme une classe wrapper. Cela ne serait-il pas arrivé si nous l'avions développé comme un essai routier depuis le début? .. .. difficile.
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 est une méthode d'AsyncTask. C'est un changement subtil, mais au début, j'ai pris java.net.URL comme argument, mais j'ai remarqué que l'URL est une classe finale et ne peut pas être moquée, alors je l'ai changée en classe wrapper. J'ai également essayé d'utiliser PowerMockito, mais cela n'a pas fonctionné, donc je l'utilise pour le moment. Vous pouvez maintenant appliquer le code de test suivant.
python
@Test
public void test_doInBackground(){
HttpURLConnection httpURLConnection = null;
try{
String rtnXml = "aaaaaaaaaaaa";
//Mocking HttpURLConnection
httpURLConnection = mock(HttpURLConnection.class);
when(httpURLConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_OK);
when(httpURLConnection.getInputStream()).thenReturn(new ByteArrayInputStream(rtnXml.getBytes("utf-8")));
//URLWrapper maquette
URLWrapper urlWrapper = mock(URLWrapper.class);
when(urlWrapper.openConnection()).thenReturn(httpURLConnection);
//ConfirmAsyncListenerImpl mock
ConfirmAsyncListenerImpl confirmAsyncListener = mock(ConfirmAsyncListenerImpl.class);
// RestaurantAsync.doInBackground()un test de
RestaurantAsync restaurantAsync = new RestaurantAsync(confirmAsyncListener);
assertThat(restaurantAsync.doInBackground(urlWrapper), is("aaaaaaaaaaaa"));
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
httpURLConnection.disconnect();
}
}
Quand j'essaye de me moquer de java.net.URL, j'obtiens une erreur de compilation, donc j'ai trouvé que je peux le gérer en utilisant une classe wrapper.
À propos, la classe wrapper est la suivante
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;
}
}
Je me demande s'il y a des différences ou des inconvénients entre prendre l'argument dans la classe finale et le prendre dans sa classe wrapper. Je l'ajouterai quand je le comprendrai à nouveau.
Je l'ajouterai si je le remarque à nouveau.
Recommended Posts