web-dev-qa-db-fra.com

@ RunWith (SpringRunner.class) vs @RunWith (MockitoJUnitRunner.class)

J'utilisais @RunWith(MockitoJUnitRunner.class) pour mon test Junit avec mockito. Mais maintenant, je travaille avec une application de démarrage de printemps et j'essaie d'utiliser @RunWith(SpringRunner.class). L'utilisation de @RunWith(SpringRunner.class) présente-t-elle des avantages par rapport à l'utilisation de @RunWith(MockitoJUnitRunner.class)? Puis-je quand même utiliser des fonctionnalités telles que @Injectmock, @Mock, @Spy avec @RunWith(SpringRunner.class)

5
user8710021

SpringRunner fournit une assistance pour le chargement d'un Spring ApplicationContext et l'insertion de beans @Autowired dans votre instance de test. Cela en fait bien plus que cela (couvert dans le manuel de référence du printemps), mais c'est l'idée de base.

Considérant que, le MockitoJUnitRunner permet de créer des simulacres et des espions avec Mockito.

Cependant, avec JUnit 4, vous ne pouvez utiliser qu'un seul Runner à la fois.

Ainsi, si vous souhaitez utiliser simultanément le support de Spring et Mockito, vous ne pouvez choisir que un de ces coureurs.

Mais vous avez de la chance car Spring et Mockito fournissent tous deux rules en plus de runners

Par exemple, vous pouvez utiliser le coureur de printemps avec la règle Mockito comme suit.

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyTests {

    @Rule
    public MockitoRule rule = MockitoJUnit.rule();

    @Mock
    MyService myService;

    // ...
}

En règle générale, si vous utilisez Spring Boot et que vous devez simuler un bean à partir de Spring ApplicationContext, vous utiliserez alors le support @MockBean de Spring Boot au lieu de simplement @Mock.

10
Sam Brannen

Selon le JavaDoc:

SpringRunner est un alias pour le SpringJUnit4ClassRunner. Pour utiliser cette classe, annotez simplement une classe de test basée sur JUnit 4 avec @RunWith(SpringRunner.class). Si vous souhaitez utiliser la structure Spring TestContext avec un autre coureur, utilisez org.springframework.test.context.junit4.rules.SpringClassRule et org.springframework.test.context.junit4.rules.SpringMethodRule.

Et le JavaDoc de TestContext:

TestContext encapsule le contexte dans lequel un test est exécuté, indépendant du framework de test utilisé.

Celui de la méthode getApplicationContext():

Obtenir le contexte d'application pour ce contexte de test, éventuellement mis en cache . Les implémentations de cette méthode sont chargées de charger le contexte de l'application si le contexte correspondant n'a pas déjà été chargé, mettant potentiellement le cache également.

SpringRunner charge donc le contexte et est responsable de sa maintenance. Par exemple, si vous souhaitez conserver des données dans une base de données intégrée, telle que la base de données H2 en mémoire, vous devez utiliser SpringRunner.class; et, pour nettoyer les tables afin de vous débarrasser des enregistrements que vous avez insérés après chaque test, annotez le test avec @DirtiesContext pour indiquer à Spring de le nettoyer.

Mais ceci est déjà un test d'intégration ou de composant. Si votre test est un test unitaire pur, vous n'avez pas à charger de base de données, ou vous voulez simplement vérifier qu'une méthode de dépendance est appelée, MockitoJUnit4Runner suffit. Vous utilisez simplement @Mock comme bon vous semble et Mockito.verify(...) et le test réussira. Et c'est beaucoup plus rapide.

Le test devrait être rapide. Aussi vite que possible. Donc, chaque fois que possible, utilisez MockitoJUnit4Runner pour l’accélérer. 

1
WesternGun