Meglio chiamare per immergersi nei sottomodelli o passare un risultato

3

Ho un servizio che esegue una logica aziendale piuttosto complicata quando riceve una richiesta. Ho la maggior parte delle funzionalità isolate in metodi privati che si abbassano di un paio di livelli rispetto al metodo che riceve la richiesta. In pratica ricevi la richiesta - > metodo privato per il sottoprocesso - > metodo privato per l'elaborazione di azioni diverse - > metodo che crea un risultato - > metodo che verifica il risultato.

Posso chiamare ciascuno di questi metodi in sequenza e passare i vari risultati tra ogni metodo privato oppure posso chiamare un metodo dall'interno del metodo successivo e continuare a passare i dati tra i passaggi nell'altro modo

//either passing around as returns or class variables
public onRequest(Request request){
        method1(request) // Returns two things for method 2
        method2(thing1, thing2) //Modifies and thing1 and thing2
        method3(thing1Mod, thing2Mod) //Returns a result
        verify(result)
        return result
}

Opzione 2

public onRequest(Request request{
    Result result = method1(request)
}

method1(request){
    //logic that makes thing1 thing2
    return method2(thing1, thing2)
}

method2 (thing1, thing2)
    //logic to modify thing1 and thing2
    return method3(thing1, thing2)

method3 (thing1, thing2) {
    //logic that gets a result from thing1, thing2
    verify(result)
    return result
}

Ogni metodo contiene funzionalità discrete.

Il motivo per cui sono preoccupato è che sto provando a scrivere casi di test e voglio solo lasciare onRequest pubblico, ma voglio ancora testare i metodi 1-3 e verificare individualmente.

Il progetto è in Java

    
posta ford prefect 26.10.2015 - 15:29
fonte

2 risposte

2

È la domanda sbagliata

Ovviamente dovresti "passare un risultato". Non solo i punti @Ewan fanno sul test, ma i parametri di passaggio rendono il codice generalmente più manutenibile. E come bonus puoi dire "Sto usando un'iniezione di dipendenza". ooohhh.

Quanto sopra non dice nulla sulla struttura del codice!

... or I can call one method from inside of the next method and keep passing along the data between steps the other way

Devi decidere quali passi - i metodi sopra citati - sono equivalenti, passi sequenziali di un dato processo e che sono veramente sotto-fasi del loro metodo di contenimento. Questo dà al tuo programma una struttura fondamentale. Definisce essenzialmente i livelli di elaborazione e, vi prometto, ha un effetto sul modo in cui il programma è compreso, quindi dove dovrebbero essere apportati cambiamenti e su come il codice si evolve a lungo termine.

Incapsulamento e testabilità

Idealmente un livello (un metodo o una gerarchia di metodi) non espone il suo coraggio all'esterno e i parametri aiutano a questo proposito.

Per quanto riguarda la testabilità, a volte la mia classe di test erediterà la classe che sto testando e quindi posso testare i metodi protected . Il che significa che raramente faccio metodi private solo per questo motivo.

E a volte va bene dedurre semplicemente la correttezza dei metodi interni - selezionare attentamente i valori dei parametri di test.

E infine, sarò onesto qui - ho reso i metodi interni public a scopo di test - perché la struttura / design del codice viene prima.

    
risposta data 27.10.2015 - 02:36
fonte
3

Se vuoi testare in unità i metodi altrimenti privati hai un certo numero di scelte

  • Riflessione! yay reflection.

  • Renderli protetti ed esporre creando una classe di accesso che erediti dall'originale

  • Rendi pubblici i metodi, ma inseriscili su altre classi di sottoservizio, che nella tua classe originale hanno istanze private.

Una volta che li hai esposti in uno di questi modi, penso che puoi vedere che la tua prima opzione, quella di chiamare ciascuno a turno dal metodo principale, ti dà la migliore "testabilità" in quanto sei in grado di testare ogni metodo separatamente dagli altri. Mentre la seconda opzione, rende difficile testare il metodo 1 se il metodo2 non funziona, ad esempio.

    
risposta data 26.10.2015 - 16:25
fonte

Leggi altre domande sui tag