web-dev-qa-db-fra.com

Comment remplacer l'annotation @Rule dans Junit 5?

J'utilise wiremock dans mes tests et j'ai une telle ligne de code:

@Rule
public WireMockRule wireMockRule = new WireMockRule(8080);

Je veux passer à Junit 5. J'ai donc ajouté la dépendance suivante (en utilisant gradle):

testCompile('org.junit.jupiter:junit-jupiter-engine:5.1.1')

Mais il n'y a aucune suggestion lorsque j'essaie d'importer une annotation @Rule. Dois-je ajouter un autre module de dépendance junit? Ou les règles ne sont pas prises en charge dans Junit5? Sinon, comment puis-je remplacer l'annotation @Rule pour que les tests fonctionnent à nouveau? Merci.

15
IKo

D'une manière générale, ce que vous avez fait avec @Rule et @ClassRule dans JUnit 4 doit être fait avec @ExtendWith et Extension qui associés fournissent une fonctionnalité très proche dans JUnit 5.
Il fonctionne comme des hooks de cycle de vie JUnit standard mais il est extrait dans une classe Extension. Et de la même manière que @Rule, autant de Extensions que nécessaire peuvent être ajoutés pour une classe de test.

Pour gérer le problème, vous avez plusieurs approches possibles parmi:

  • garder la voie JUnit 4 (JUnit 5 possède la partie JUnit Vintage qui permet d'exécuter des tests JUnit 3 ou 4).
  • réecrit le @Rule en tant que Extension.
  • faire le traitement réel effectué par WireMockRule (démarrer le serveur, exécuter vos tests et arrêter le serveur) dans chaque test de classe avec @BeforeEach et @AfterEach méthodes de hook.
  • utiliser une troisième bibliothèque qui implémente l'équivalent de WireMockRule à la manière de l'extension JUnit 5, comme https://github.com/lanwen/wiremock-junit5

Notez que votre problème a déjà été abordé dans les problèmes JUnit 5 .

6
davidxxx

JUnit 4 annotations @Rule et @ClassRule n'existent pas dans JUnit 5. Fondamentalement, il existe un nouveau modèle d'extension qui peut être utilisé pour implémenter des extensions avec les mêmes fonctionnalités. Ces extensions peuvent être utilisées avec le @ExtendWith annotation.

Il existe un support de migration limité pour un sous-ensemble de règles JUnit 4 dans le module junit-jupiter-migrationsupport . Malheureusement, il n'est limité qu'aux sous-classes de ExternalResource et Verifier.

Avant que wiremock n'ait un support officiel pour JUnit, vous avez quelques solutions:

  1. Exécutez les tests JUnit 4 côte à côte avec les tests JUnit 5 avec le junit-vintage-engine .
  2. Démarrez et arrêtez le serveur vous-même dans le code de test.
  3. Utilisez une extension tierce comme wiremock-junit5 ou wiremock-extension .
2
Arho Huttunen