L'une des raisons de printemps est décrit comme test de l'environnement est parce qu'il peut être facile de simplement de nouvelles ou des trucs dans le test de l'unité.
Alternativement, nous avons utilisé la configuration suivante avec un grand succès, et je pense que c'est assez proche de ce que tu veux, je voudrais vivement recommande:
Pour tous les haricots qui ont besoin de différentes mises en œuvre dans des contextes différents, passer à l'annotation en fonction de câblage. Vous pouvez laisser les autres-est.
Mettre en œuvre l'ensemble des annotations
<context:component-scan base-package="com.foobar">
<context:include-filter type="annotation" expression="com.foobar.annotations.StubRepository"/>
<context:include-filter type="annotation" expression="com.foobar.annotations.TestScopedComponent"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
Ensuite, vous annoter votre live implémentations avec @Référentiel, votre talon implémentations avec @StubRepository, tout le code qui doit être présent dans l'unité de montage d'essai UNIQUEMENT avec @TestScopedComponent. Vous pouvez exécuter dans un besoin d'un couple de plus annotations, mais ceux-ci sont un excellent point de départ.
Si vous avez beaucoup de spring.xml, vous aurez probablement besoin de faire un peu de nouvelles du printemps des fichiers xml que, fondamentalement, ne contiennent que de la composante-analyse des définitions. Normalement vous devriez simplement ajouter ces fichiers à votre régulière @ContextConfiguration liste. La raison pour cela est parce que vous finissent souvent avec des configurations différentes du contexte-analyse (faites-moi confiance, vous permettra d' en faire au moins 1 de plus annotations si vous êtes en train de faire du web-tests, ce qui rend pour 4 des combinaisons pertinentes)
Puis, fondamentalement, vous utilisez le
@ContextConfiguration(locations = { "classpath:/path/to/root-config.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
Notez que ce programme d'installation ne pas vous permettre d'avoir une alternance de combinaisons de stub/données en direct. Nous avons essayé cela, et je pense que cela a entraîné un désordre, je ne recommanderais pas à personne ;) Nous fil inn l'ensemble de talons ou de l'ensemble des services live.
Nous utilisons principalement l'auto-filaire stub de dépendances lors de l'essai de gui près de trucs où les dépendances sont généralement tout à fait substantiels. En nettoyant le code que nous utilisons de plus en plus réguliers de tests unitaires.
Dans notre système, nous avons les éléments suivants de fichiers xml pour la composante d'analyse:
- régulière de la production web
- pour le démarrage de web avec des talons de seulement
- pour les tests d'intégration (dans junit)
- pour les tests unitaires (en junit)
- pour le sélénium tests web (dans junit)
Cela signifie que nous avons totalement d'avoir 5 différents à l'échelle du système des configurations que l'on peut démarrer l'application avec. Puisque nous utilisons seulement les annotations, le printemps est assez rapide pour autowire même ceux des tests unitaires nous voulons filaire. Je sais que c'est original, mais c'est vraiment génial.
De l'intégration les tests s'exécutent avec le live complet de l'installation, et une fois ou deux fois j'ai décidé de vraiment pragmatique et qui veulent avoir une 5 live câblages et une seule maquette:
public class HybridTest {
@Autowired
MyTestSubject myTestSubject;
@Test
public void testWith5LiveServicesAndOneMock(){
MyServiceLive service = myTestSubject.getMyService();
try {
MyService mock = EasyMock.create(...)
myTestSubject.setMyService( mock);
.. do funky test with lots of live but one mock object
} finally {
myTestSubject.setMyService( service);
}
}
}
Je sais que le test puristes vont être tous sur moi pour cela. Mais parfois, c'est juste un de très pragmatique solution qui s'avère être très élégant lorsque l'alternative serait vraiment vraiment moche. De nouveau, c'est généralement dans ces gui-à proximité de zones.