Test unitari per costruttori

1

Se creo una classe, quella nel costruttore accetta una matrice o una raccolta, ma questa matrice o raccolta è facoltativa (il parametro può essere nullo), e quindi memorizzo quella raccolta nell'oggetto in questione, nel costruttore i bisogno di qualcosa come:

this.coll = coll == null ? null : coll.clone();

Devo eseguire un test unitario di questo tipo di codice? come verificare se funziona quando si passa null o no?

    
posta Michał Zegan 28.01.2017 - 17:15
fonte

2 risposte

4

Tecnicamente, ciò che dovresti testare dipende dai tuoi obiettivi di test . Ma in generale, dovresti provare a testare tutto ciò che può andare storto. Qui:

this.coll = coll == null ? null : coll.clone();
  • Potresti aver dimenticato di usare il parametro coll , cioè manca l'affermazione precedente. Questo può essere verificato da un test che dipende dal coll fornito al costruttore.

  • Potresti aver dimenticato di clonare il parametro:

    this.coll = coll;
    

    Questo può essere verificato da un test che modifica il parametro coll e confronta il risultato con coll di proprietà dell'oggetto. Dovrebbero essere diversi dopo la modifica.

  • Potresti aver dimenticato di gestire il caso nullo:

    this.coll = coll.clone();
    

    Questo può essere verificato da un test che omette questo parametro / fornisce un valore nullo. Di solito ci aspettiamo un'eccezione, qui un valore null è OK.

  • Un'altra cosa che potrebbe andare storta è creare un oggetto nullo o un'istanza predefinita quando viene rilevato un valore nullo, ad esempio:

    this.coll = coll == null ? new Collection() : coll.clone();
    

    Se il tuo codice è corretto, vuoi assicurarti che qui ci sia un null reale, non un'istanza predefinita.

Sono già quattro i casi di test che sarebbero sensibili a questa semplice linea di codice. L'utilizzo di uno strumento di copertura del codice può aiutare a rilevare i casi scoperti nel codice, in particolare se si guarda anche alla copertura delle filiali. Alcuni strumenti hanno problemi con il controllo del flusso a livello di espressione ( ?: , && , || ) quindi è meglio (e più leggibile anche per gli umani!) Usare i condizionali a livello di istruzione:

if (coll != null) {
    coll = coll.clone();
}
this.coll = coll;
    
risposta data 28.01.2017 - 17:39
fonte
1

Se deve generare un'eccezione quando si passa al costruttore un valore null, è opportuno avere un test che diventa verde solo quando il passaggio null produce un'eccezione.

Praticamente qualsiasi comportamento che ci si aspetta da una classe è un candidato per i test unitari. Questo vale anche per i costruttori.

    
risposta data 28.01.2017 - 17:31
fonte

Leggi altre domande sui tag