Supponiamo che ho pianificato di scrivere una classe che ha funzionato in questo modo:
public class GameCharacter {
private Collection<CharacterEffect> _collection;
public void Add(CharacterEffect e) { ... }
public void Remove(CharacterEffect e) { ... }
public void Contains(CharacterEffect e) { ... }
}
Quando aggiunto un effetto fa qualcosa al personaggio e viene quindi aggiunto a _collection. Quando viene rimosso, l'effetto ripristina la modifica al personaggio e viene rimosso da _collection.
È facile verificare se l'effetto è stato applicato al personaggio, ma come faccio a verificare che l'effetto sia stato aggiunto a _collection?
Quale test potrei scrivere per iniziare a costruire questo corso. Potrei scrivere un test in cui Contains restituirebbe true per un determinato effetto in _collection, ma non posso organizzare un caso in cui quella funzione restituirebbe true perché non ho implementato il Aggiungi metodo necessario per posizionare elementi in _collection.
Ok, quindi dato che Contains dipende dall'avere Add funzionante, allora perché non provo a creare Aggiungi prima. Bene, per il mio primo test devo cercare di capire se l'effetto è stato aggiunto alla raccolta. Come potrei farlo? L'unico modo per vedere se un effetto è in _collection è con la funzione Contains .
L'unico modo in cui potrei pensare di testare questo sarebbe usare un FakeCollection che deride Add, Remove e Contains di una vera collezione, ma non voglio che _collection sia influenzato da fonti esterne. Non voglio aggiungere una funzione setEffects (effetti collezione) , perché non voglio che la classe abbia quella funzionalità. L'unica cosa che penso potrebbe funzionare è questa:
public class GameCharacter<C extends Collection> {
private Collection<CharacterEffect> _collection;
public GameCharacter() {
_collection = new C<CharacterEffect>();
}
}
Ma è solo sciocco farmi dichiarare quale tipo di strutture di dati private si trova su ogni dichiarazione del personaggio.
C'è un modo per testarlo senza rompere i principi di TDD, pur continuando a consentirmi di mantenere privata la mia collezione?