Ho un metodo che fa parte dell'interfaccia che sto implementando. Questo metodo chiama un altro metodo privato che utilizza un generatore di numeri casuali per produrre l'output e restituirlo al metodo di chiamata. Voglio testare il metodo di chiamata. Come lo posso fare? Questo è il metodo sotto test:
@Override
public String generate(int wordCount) {
StringBuilder sentence = new StringBuilder();
List<String> selectedStrings = selectRandomStringsFromInternalVocabulary(wordCount, new Random());
selectedStrings.sort(Comparator.<String>naturalOrder());
swapOddIndexedStringsWithEvenIndexedStrings(selectedStrings);
for (String word: selectedStrings)
sentence.append(word)
.append(" ");
return sentence.toString().trim();
}
Questo è il metodo che usa il generatore di numeri casuali:
private List<String> selectRandomStringsFromInternalVocabulary(int wordCount, Random random) {
List<String> selectedStrings = new ArrayList<>();
int wordCountInVocabulary = internalVocabulary.size();
while (wordCount-- != 0) {
int stringIndex = random.nextInt(wordCountInVocabulary);
selectedStrings.add(internalVocabulary.get(stringIndex));
}
return selectedStrings;
}
Ci sono alcune cose che ho pensato di poter fare: 1. Rendi privato il secondo pacchetto di metodi e testalo. Ma non voglio testare un metodo privato se posso evitarlo. 2. Aggiungi Casuale come parametro alla funzione chiamante e passa una simulazione durante il test. Tuttavia, la sua parte dell'interfaccia e altre classi che la implementano non usano RNG. Inoltre, non voglio che i clienti sappiano dei dettagli di implementazione.
Ho seguito queste domande: 1. Metodi di test unitari con output indeterminato 2. Unit Test di una funzione con comportamento casuale
Ma i suggerimenti sono simili a quelli che ho citato sopra.