L'une des raisons pour lesquelles le ressort est décrit comme étant facile à tester est qu'il peut être facile de simplement nouveau ou de simuler le test unitaire.
Sinon, nous avons utilisé la configuration suivante avec un grand succès, et je pense qu'il est assez proche de ce que vous voulez, je fortement le recommande:
Pour tous les haricots qui ont besoin d'implémentations différentes dans des contextes différents, passer au câblage basé sur des annotations. Vous pouvez laisser les autres tels quels.
Mettre en oeuvre l'ensemble suivant 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 vos en direct avec les implémentations @Repository, votre stub implémentations avec @StubRepository, tout code qui devrait être présent dans l'appareil de test d'unité UNIQUEMENT avec @TestScopedComponent. Vous pouvez avoir besoin de quelques annotations de plus, mais ce sont un bon début.
Si vous avez beaucoup de spring.xml, vous aurez probablement besoin de faire quelques nouveaux fichiers spring xml qui ne contiennent essentiellement que les définitions de scan de composants. Vous devez normalement ajouter ces fichiers à votre liste @ContextConfiguration habituelle. La raison en est que vous vous retrouvez souvent avec des configurations différentes des analyses de contexte (faites moi confiance, fera au moins 1 annotations de plus si vous faites des tests web, ce qui fait 4 combinaisons pertinentes)
Ensuite, vous utilisez essentiellement le
@ContextConfiguration(locations = { "classpath:/path/to/root-config.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
Notez que cette configuration ne pas vous permettent d'avoir des combinaisons alternatives de données stub/live. Nous avons essayé cela, et je pense que cela a abouti à un désordre que je ne recommanderais à personne;) Nous fournissons soit l'ensemble complet des talons, soit l'ensemble complet des services en direct.
Nous utilisons principalement des dépendances de branchement auto-câblées lorsque nous testons gui près de choses où les dépendances sont généralement assez importantes. Dans les zones plus propres du code, nous utilisons des tests unitaires plus réguliers.
Dans notre système, nous avons les fichiers xml-suivants pour le composant-scan:
- pour la production web régulière
- pour le démarrage web avec des talons que
- pour les tests d'intégration (en JUnit)
- pour les tests unitaires (en junit)
- pour les tests web de sélénium (en junit)
Cela signifie que nous avons totalement 5 configurations différentes à l'échelle du système avec lesquelles nous pouvons démarrer l'application. Puisque nous n'utilisons que des annotations, le ressort est assez rapide pour autowire même les tests unitaires que nous voulons câblés. Je sais que c'est non traditionnel, mais c'est vraiment génial.
tests d'intégration exécuté avec une configuration live pleine, et une ou deux fois j'ai décidé de se vraiment pragmatique et que vous voulez avoir un 5 câblages en direct 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 les puristes vont être sur moi pour ça. Mais parfois, c'est juste une solution très pragmatique qui s'avère très élégante quand l'alternative serait vraiment vraiment moche. Encore une fois, il est généralement dans ces zones gui-near.
Le ressort rend les tests unitaires simples. C'est la partie qui vous manque - vous faites un test d'intégration et non un test unitaire. Dans un vrai test unitaire, tous les beans dépendants devraient être des simulacres, car vous testez uniquement une unité et non un système entier. – bpapa
Comment * test unitaire * une application de printemps: http://confessionsofanagilecoach.blogspot.com/2016/05/unit-testing-spring-applications.html –