Comment puis-je ouvrir les paquets et nécessitent des dépendances sur les modules de portée test uniquement pour les tests JUnit

Kevin Kussmaul:

Je migration d'un projet jar de java 10 à l'aide classpath java 11 en utilisant les modules de puzzle java 9. Il existe des tests JUnit5 pour le projet. Les dépendances de test sont fournis au champ d'essai par Maven. Comment faire tous les paquets ouverts pour tester mais pas ouvrir lorsque le module est utilisé par un autre projet?

Le projet jar est seulement à fournir quelques classes (comme un projet d'utilité) pour d'autres projets (donc pas de classe principale nécessaire).

Le projet a 5 paquets à / src / main / java / a / b / c / . 2 d'entre eux devraient être accessibles pour les projets utilisant ce pot. Les 3 autres sont à usage interne uniquement (utilisée par les accessibles). Les tests sont situés à / src / test / java / a / b / c / . Ces tests ont des dépendances (JUnit, Mockito, Junt-params) prévues dans la portée d'essai, puisque les tests ne sont pas pertinents pour les projets utilisant ce pot

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>

J'ai fourni un module-info.java à / src / main / java / :

module moduleName {

requires java.base;

exports a.b.c.package1;
exports a.b.c.package3;
}

maintenant les classes publiques dans le paquet 1 et 3 devraient être accessibles à d'autres projets comme prévu (je ne l'ai pas été en mesure de vérifier encore cela).

Exécution des résultats des tests maintenant java.lang.reflect.InaccessibleObjectException: Impossible de faire abcpackage1.collections.SomeTest () accessible: Module moduleName ne "ouvre abcpackage1" au module sans nom @ 6a84a97d

quand j'ouvre les paquets (avec ouvre ) tout lisse fonctionne. Mais maintenant , tous les paquets sont maintenant ouverts. Je pense forfait 2, 4 et 5 sont accessibles uniquement pendant les tests et 1 et 3 ne doivent pas être ouverts à la réflexion (donc uniquement exportés).

Je suis venu à penser, puisque maven me dit le module sans nom @ 6a84a97d , cela pourrait être un module créé pour les tests. Cela m'a fait essayer d' ajouter module-info.java à / src / test / java / pour tester.

module moduleNameTest {
requires moduleName; // the code to test
requires java.base;  // java.base could be transient on moduleName

// test dependencies
requires org.junit.jupiter.api;
requires org.junit.jupiter.params;
}

maintenant Maven (3.5.4) stipule que:

src/test/java/module-info.java:[3,20] module not found: moduleName
src/test/java/module-info.java:[4,31] module not found: org.junit.jupiter.api
src/test/java/module-info.java:[5,31] module not found: org.junit.jupiter.params

Les technologies:

  • java openjdk 11
  • mvn 3.5.4
  • JUnit 5.3.0
  • Surefire Plugin 3.0.0-M3
  • Mockito 2.21.0

Comme indiqué plus tôt, je pense forfait 2, 4 et 5 sont accessibles uniquement pendant les tests et les tests à exécuter sur la construction du pot avec Maven. Forfait 1 et 3 devraient être exportés dans le cadre d'autres projets, mais pas ouvert à la réflexion (donc n'exportait pas ouvert).

Si vous avez besoin d'informations supplémentaires ne hésitez pas à demander.

Merci d'avance

Kevin

Sormuras:

« Bienvenue sur le contrôle dans le monde modulaire », Kevin.

Je compilé un blog sur ce sujet ici: https://github.com/sormuras/testing-in-the-modular-world

En gros, quand il s'agit de tests boîte blanche, vous devez modifier le système de module soit à la compilation de test ou d' exécution de test pour permettre de tester les cadres de contourner les barrières du système de module.

Je suppose que , vous êtes sur la bonne voie ... peut - être Surefire fait la mauvaise chose? Vous voulez donner https://github.com/sormuras/junit-platform-maven-plugin je l' ai écrit un coup de feu? Ce support de plugin et le test blanc Black--case de la boîte. Surtout, ce plugin brille, lorsque vous fournissez un test/java/module-info.javadescripteur de module de test.

Voir cette « image » pour savoir comment organiser des tests modulaires sans toucher le descripteur principal du module:

src ├── main │ └── java │ ├── foo │ │ ├── PackageFoo.java │ │ └── PublicFoo.java │ └── module-info.java <------------------ module foo { exports foo; } ├── test │ └── java .--- open module foo { │ ├── foo / exports foo; │ │ └── PackageFooTests.java / requires org.junit.jupiter.api; │ └── module-info.[java|test] <----< } └── it \ └── bar °---- --add-reads └── src foo=org.junit.jupiter.api └── test --add-opens └── java foo/foo=org.junit.platform.commons ├── bar │ └── PublicFooTests.java └── module-info.java <------ open module bar { requires foo; requires org.junit.jupiter.api; }

Ce modèle devrait être facile à adopter à votre configuration ainsi.

Question connexe: Comment organisez-vous des tests dans un projet Java modulaire?

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=138119&siteId=1
conseillé
Classement