A propos de l'utilisation Stubs - Java
Question
Je suis readin http://xunitpatterns.com/Test%20Stub.html avez des questions sur l'utilisation des talons, par exemple, dans le code indiqué sur la page de l'auteur crée une classe appelée TimeProviderTestStub.java
pour une utilisation dans le code de test. J'ai quelques doutes au sujet de cette ligne dans le code de test:
TimeDisplay sut = new TimeDisplay();
// Test Double installation
sut.setTimeProvider(tpStub);
Ai-je besoin de ma classe modifie (SUT) pour recevoir un objet TimeProviderTestSub?
La solution
Tant le talon et la classe réelle sont censés mettre en œuvre une interface, à savoir ITimeProvider
et setTimeProvider()
devrait prendre cette interface comme paramètre. L'interface doit exposer toutes les méthodes que les besoins SUT d'interagir avec l'objet, puisque TimeDisplay
peut désormais utiliser uniquement l'objet via l'interface ITimeProvider
(ce qui nous permet d'utiliser un talon au lieu de l'objet réel dans nos tests).
Dans l'exemple, le SUT (TimeDisplay
) semble seulement besoin de la méthode getTime()
, donc l'interface ne doit contenir que cette méthode:
public interface ITimeProvider {
Calendar getTime();
}
La déclaration du talon doit être
public class TimeProviderTestStub implements ITimeProvider { ... }
et la déclaration de la classe réelle devrait être
public class TimeProvider implements ITimeProvider { ... }
Enfin, le SUT doit changer sa méthode setter pour accepter l'interface:
public void setTimeProvider(ITimeProvider timeProvider) { ... }
et aussi changer son champ de timeProvider
interne pour être du type ITimeProvider
.
Si vous ne contrôlez pas le code de la classe réelle (de sorte que vous ne pouvez pas faire implémenter l'interface), vous pouvez créer une classe d'adaptateur qui enveloppe la vraie classe et implémente l'interface.