Nella discussione di J.B. Rainsberger sui test di collaborazione descrive come i test per i "clienti" (utenti di una particolare interfaccia) dovrebbero avere due parti per il loro test.
- Il cliente fa le domande giuste dell'interfaccia? Controllato tramite mocking e verifica.
- Il client reagisce correttamente quando riceve le risposte? Controllato tramite i valori di ritorno di stub dall'interfaccia.
La mia domanda è in relazione alla parte 1 ("il cliente fa le domande giuste?"). Usa l'esempio che potremmo verificare che il client invii la query corretta a un'interfaccia generica del database. Questo verrebbe verificato verificando una chiamata al metodo su un'interfaccia come query(String qry)
. Tutte le informazioni utili sono contenute in un parametro di un metodo di interfaccia.
Questo sembra essere in conflitto con un altro obiettivo dell'uso di livelli di dati collegabili. Immagina un caricatore di record generico che carichi un elenco di stringhe.
public interface RecordLoader {
public List<String> loadRecords();
}
In questo caso vogliamo avere un FlatFileLoader
concreto che carichi i record. Ovviamente non possiamo inserire File
nell'interfaccia, perché non sarebbe più possibile implementare un'ipotetica percentuale diDatabaseLoader
. Nessun problema, il FlatFileLoader
può prendere un File
come argomento del costruttore.
public class FlatFileLoader implements RecordLoader {
public FlatFileLoader(File sourceFile) {
// ...
}
}
Ma ora abbiamo creato una lacuna nella nostra copertura di test: il particolare File
che viene utilizzato per caricare i record è probabilmente una parte fondamentale della domanda che il client (ad esempio un EmployeeLoader
) sta chiedendo al interfaccia, e non possiamo verificare che questo sia corretto. Siamo stati in grado di farlo nell'esempio del database, favorito dal fatto che la query è una stringa non tipizzata. È il punto che dovremmo creare interfacce ancora più specifiche che prendono parametri ben tipizzati per tutto il loro stato? O dovremmo spingere i dettagli del concreto RecordLoader
da qualche altra parte - e in tal caso, dove viene testato?