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)
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
.
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 SpringTestContext
avec un autre coureur, utilisezorg.springframework.test.context.junit4.rules.SpringClassRule
etorg.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.