È considerata una cattiva pratica creare il metodo Object.equals () solo a scopo di test? [duplicare]

6

Come dice il titolo, è una cattiva pratica creare / generare il metodo Object.equals () perché ne ho bisogno nei miei test di unità, ma non nel mio codice normale?

    
posta Jelle 05.12.2016 - 13:03
fonte

2 risposte

4

Scrivere un codice per facilitare i test è una buona cosa. Scrivere codice solo per i test per aggirare il codice scritto male è sbagliato.

Se stai pensando di scrivere un metodo equals() perché ne hai bisogno nei test delle tue unità, allora questo dovrebbe far funzionare i campanelli d'allarme. Perchè ne hai bisogno? I test dovrebbero esercitare le API pubbliche del tuo codice. Se tali API non espongono le classi con equals() personalizzato, non è necessario testarle in questo modo.

Quindi sì, è una cattiva pratica aggiungere funzionalità al codice base solo per l'uso con i test unitari. Stai solo coprendo le fessure quando lo fai. Risolvi invece il problema reale, per rimuovere la necessità di tale codice aggiuntivo.

Aggiorna Poiché lo scopo di questo codice non è quello di accedere ai valori incapsulati, ma per testare l'uguaglianza delle basi degli oggetti su valori accessibili pubblicamente, allora equals() è buono: non solo sugli oggetti dominio stessi. Crea il metodo nella classe / pacchetto di test (a seconda dell'ambito richiesto) e chiedi ai tuoi test di chiamarlo.

    
risposta data 05.12.2016 - 13:21
fonte
0

L'uguaglianza degli oggetti nei test delle unità è probabilmente necessaria per verificare i risultati prodotti dal codice di produzione. Poiché l'API pubblica di questi risultati è tutto ciò che si desidera controllare nei test, esiste un modo semplice ma conveniente per eseguire gli stessi confronti in modo non intrusivo.

Crea una classe descrittore, che accetta l'oggetto in questione come argomento, ispeziona la sua API pubblica per le proprietà interessanti e le rende come campi. Tale descrittore è banalmente costruibile dai valori del campo e quindi potrebbe essere usato facilmente nei test:

class Descriptor {
    int field1;
    string field2;
    Descriptor(f1,f2){
        field1=f1;
        field2=f2;
    }
    Descriptor(IResult r) {
       this (r.getNumber (), r.getString ());
    }
    booolean equals(Descriptor d) {
       return field1.equals (d. field1) && field2.equals (d. field2);
    }

    string toString () {
       some test frameworks will be more helpful, provided with string representation of data under verification
    }
}


.....


 void test () {
     Descriptor  actual = new Descriptor (subject.produce ());
     Descriptor expected = new Descriptor (0, "Hello world!");
     assertEquals (expected, actual, "Should greet the world");
 }
    
risposta data 05.12.2016 - 18:24
fonte

Leggi altre domande sui tag