[JAVA] Comment utiliser la classe wrapper

Aperçu

Comment utiliser la classe wrapper.

Quand tu veux te moquer de la classe finale

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.

Code d'origine

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();
}

Code modifié

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.

Résumé

Je l'ajouterai si je le remarque à nouveau.

Recommended Posts

Comment utiliser la classe wrapper
[Java] Comment utiliser la classe File
[Traitement × Java] Comment utiliser la classe
[Java] Comment utiliser la classe Calendar
Comment utiliser la classe Java
Comment utiliser la méthode link_to
Comment utiliser la méthode include?
Comment utiliser la méthode form_with
Comment utiliser les méthodes de classe [Java]
[Java] Comment utiliser la classe Math
[Rails] Comment utiliser la méthode de la carte
[Java] Comment utiliser la méthode toString ()
Etudier comment utiliser le constructeur (java)
[Traitement × Java] Comment utiliser la boucle
Comment utiliser la classe Java Scanner (Remarque)
[Traitement × Java] Comment utiliser la fonction
Comment utiliser Map
Comment utiliser with_option
Comment utiliser fields_for
Comment utiliser java.util.logging
Comment utiliser la carte
Comment utiliser collection_select
Comment utiliser Twitter4J
Comment utiliser active_hash! !!
Comment utiliser MapStruct
Comment utiliser TreeSet
[Comment utiliser l'étiquette]
Comment utiliser l'identité
Comment utiliser le hachage
Comment utiliser Dozer.mapper
Comment utiliser Gradle
Comment utiliser org.immutables
Comment utiliser java.util.stream.Collector
Comment utiliser VisualVM
Comment utiliser Map
Comment utiliser le module caméra OV7725 (ESP32-WROVER-B)
[Java] Comment utiliser la classe FileReader et la classe BufferedReader
Sortie de la façon d'utiliser la méthode slice
Comment utiliser la méthode replace () (Java Silver)
[Introduction à Ruby] Comment utiliser la méthode slice
[Java] Comment utiliser la classe Calendar et la classe Date
Comment utiliser l'API Chain
[Java] Comment utiliser Map
Comment utiliser Queue avec priorité
[Rails] Comment utiliser enum
Comment utiliser java Facultatif
Comment utiliser JUnit (débutant)
Comment utiliser le retour Ruby
[Rails] Comment utiliser enum
Comment utiliser @Builder (Lombok)
Comment utiliser Big Decimal
[Java] Comment utiliser removeAll ()