web-dev-qa-db-fra.com

Comment fonctionne Junit @Rule?

Je souhaite écrire des scénarios de test pour une grande partie du code. J'aimerais connaître les détails de la fonctionnalité d'annotation JUnit @Rule afin de pouvoir l'utiliser pour l'écriture de scénarios de test. Veuillez fournir de bonnes réponses ou des liens donnant une description détaillée de ses fonctionnalités à travers un exemple simple.

182
Dipak

Les règles sont utilisées pour ajouter des fonctionnalités supplémentaires qui s'appliquent à tous les tests d'une classe de test, mais de manière plus générique.

Par exemple, ExternalResource exécute le code avant et après une méthode de test, sans avoir à utiliser @Before et @After. L'utilisation d'un ExternalResource plutôt que de @Before et @After donne des possibilités d'améliorer la réutilisation du code; la même règle peut être utilisée à partir de deux classes de test différentes.

La conception était basée sur: Interceptors in JUnit

Pour plus d'informations, voir JUnit wiki: Rules .

140
Matthew Farwell

Les règles Junit fonctionnent sur le principe de la programmation orientée aspect (AOP). Il intercepte la méthode de test, offrant ainsi la possibilité d'effectuer certaines tâches avant ou après l'exécution d'une méthode de test particulière.

Prenons l'exemple du code ci-dessous:

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

  @Test
  public void testRule() throws IOException {
    File newFolder = tempFolder.newFolder("Temp Folder");
    assertTrue(newFolder.exists());
  }
} 

Chaque fois que la méthode de test ci-dessus est exécutée, un dossier temporaire est créé et il est supprimé après l'exécution de la méthode. Voici un exemple de règle prête à l'emploi fournie par Junit.

Un comportement similaire peut également être obtenu en créant nos propres règles. Junit fournit l'interface TestRule, qui peut être implémentée pour créer notre propre règle Junit.

Voici un lien utile pour référence:

55
Abhishek Mohanty

J'ai trouvé cet article explique @Rules plutôt bien, consultez en particulier la dernière section "La séquence d'événements en détail"

21
Peter Perháč

tl; dr pour son fonctionnement: JUnit encapsule votre méthode de test dans un objet Statement afin que statement.Execute () exécute votre test. Ensuite, au lieu d'appeler statement.Execute () directement pour exécuter votre test, JUnit transmet l'instruction à une règle de test avec l'annotation @Rule. La fonction "appliquer" de la règle de test renvoie une nouvelle instruction à partir de l'instruction avec votre test. La méthode Execute () de la nouvelle instruction peut appeler la méthode execute de l'instruction test (ou non, ou l'appeler plusieurs fois) et faire ce qu'elle veut avant et après. Maintenant, JUnit a une nouvelle instruction qui ne se contente pas d’exécuter le test. Elle peut à nouveau transmettre cette information à d’autres règles avant d’appeler enfin Execute.

13
Alexander Taylor