web-dev-qa-db-fra.com

Test de démarrage de printemps: contexte chargé pour chaque test?

Dans mon projet, nous avons une super classe pour tous nos tests. Ceci est la signature de cette classe

@RunWith(SpringRunner.class)
@SpringBootTest(value = {"management.port=0"}, classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT)
@ActiveProfiles({"localhost", "test"})
@ContextConfiguration(classes = {Application.class, SomeConfiguration.class})
@Ignore
public abstract class AIntegrationTest {

Où Application.class est notre classe principale et SomeConfiguration.class juste pour certains @Bean et autres, rien de spécial.

J'utilise gradle, et pour exécuter mes tests, je fais:

./gradlew :my-project:test

Mes problèmes sont:

  • Je ne sais pas si pour chaque test le contexte est en cours d'initialisation. Mais je peux vous assurer que le contexte est initialisé plusieurs fois. Je le sais en regardant les journaux.
  • Puisque plusieurs contextes sont initialisés, il semble que les contextes se chevauchent. Je le sais car l'un des symptômes est cette exception:

    Caused by: org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [org.springframework.cloud.context.environment.EnvironmentManager@36408d9e] with key 'environmentManager'; nested exception is javax.management.InstanceAlreadyExistsException: RedeemAway:name=environmentManager,type=EnvironmentManager
    
  • Même si je ne me soucie pas des multiples contextes chargés, j'ai l'impression que lorsqu'un test se termine, le test suivant obtient un nouveau contexte AVANT que le précédent ne soit terminé. Je l'ai dit en raison du chevauchement de l'exception d'en haut.

Étant donné que tous les tests partagent la même machine virtuelle Java, lorsque certains beans sont enregistrés deux fois, cette exception se lève. De ce lien:

Mise en cache du contexte

Il est dit que:

Un ApplicationContext peut être identifié de manière unique par la combinaison de paramètres de configuration qui est utilisé pour le charger. Par conséquent, la combinaison unique de paramètres de configuration est utilisée pour générer une clé sous laquelle le contexte est mis en cache. Le framework TestContext utilise les paramètres de configuration suivants pour créer la clé de cache de contexte

Je comprends cela, mais je me demande comment puis-je y parvenir? Mon objectif est d'exécuter tous mes tests sur la même machine virtuelle Java et de réutiliser le contexte à chaque test.

EDIT le jeu 22 fév

Choses que j'ai essayées:

  • spring.jmx.enabled: false
  • domaine-spring.jmx.default: valeur

Vraiment, la désactivation de JMX ne devrait pas aider, car l'excpetion concerne l'environnementManager, qui provient de Spring Cloud.

10
Perimosh

J'ai trouvé la réponse à mon problème. Voici bien expliqué:

https://github.com/spring-projects/spring-boot/issues/7174

Fondamentalement, si vous exécutez un tas de tests, dès que l'un d'eux démarre, s'il utilise l'annotation @MockBean, il forcera Spring à recharger le contexte.

Bonus: vous verrez le même comportement si votre test utilise org.mockito.Mock.

6
Perimosh