Creazione di nuovi costruttori per sovrascrivere le variabili di istanza esistenti a scopo di test

2

È buona pratica fare aggiunte di più costruttori solo a scopo di test (per deridere i DOC usati nel mio SUT) in questo modo:

public class A {
    private B b = new B();
    private C c = new C();

    public A(){
    }

    /***
     * used for test puproses
     * @param a
     * @param b
     */
    A(A a, B b) {
        // overwrite the existing variables
        this.a = a;
        this.b = b;
    }
}

class B {
}

class C {
}

Nota che costringo la nuova visibilità del costruttore a essere privata del pacchetto, non a inquinare l'api del SUT e anche a istanziare i DOC all'interno del SUT per la comodità d'uso del client.

SUT: System under test (A)

DOC: depended-on component (B and C)

Che ne pensi? Grazie in anticipo.

    
posta isqo 08.11.2018 - 23:53
fonte

4 risposte

6

Lo farei a prescindere dai test solo per evitare hard coding B e C. In effetti, rifiuterei questo codice se non fornissi un modo per sovrascrivere be c. Ora, piuttosto che essere codificati, sono semplicemente valori predefiniti sovrascrivibili. Questa è una buona cosa.

    
risposta data 09.11.2018 - 05:20
fonte
4

Il tuo codice mi sembra buono (tranne gli errori di battitura nel secondo costruttore, vedi sotto).

Potresti considerare il seguente refactoring, che presenta i seguenti vantaggi:

  1. Non instanzia inutilmente le classi B e C.
  2. Permette di dichiarare definitivo i campi b e c, se appropriato.

Refactoring:

public class A {
    private final B b;
    private final C c;

    public A() {
        this(new B(), new C());
    }

    public A(B b, C c) {
        this.b = b;
        this.c = c;
    }
} 
    
risposta data 09.11.2018 - 12:25
fonte
1

Hai appena scoperto un odore di codice, dal momento che i test sono difficili da scrivere. Ti suggerisco di fornire A & B oggetti tramite l'iniezione di dipendenza, piuttosto che istanziarli da soli. Finirai con un'architettura più flessibile, che è anche facilmente testabile tramite i mock.

    
risposta data 09.11.2018 - 13:48
fonte
0

In C #, preferisco creare tali istanze con metodi statici. Portano anche un "strongsting" nel loro nome, in modo che il loro scopo diventi chiaro.

Potrebbe sembrare

internal static A CreateWithDependenciesForTesting(B b1, C c1)
{
    A instance = new A
    {
        b = b1,
        c = c1
    };
    return instance;
}

Non sono un programmatore Java, quindi non posso dirti se (o come) quel metodo è applicabile lì.

    
risposta data 12.11.2018 - 09:56
fonte

Leggi altre domande sui tag