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:
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:
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:
Vraiment, la désactivation de JMX ne devrait pas aider, car l'excpetion concerne l'environnementManager, qui provient de Spring Cloud.
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.