2017-06-13 2 views
0

J'écris des tests d'intégration pour une application Spring-Boot, et j'utilise une classe de test de base pour les méthodes courantes et toutes les autres choses courantes. Quelque chose comme ceci:Impossible d'enregistrer MBean

@ActiveProfiles("test") 
@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = ...) 
@Sql(scripts = { "script1.sql", ... }, ...) 
public abstract class ITBase { 
... 

J'ai un générateur de fichier, qui est autowired dans un service, qui est autowired dans un contrôleur. Je teste le contrôleur en utilisant RestTemplate. Je voudrais me moquer du générateur de fichiers, pour retourner juste une chaîne aléatoire.

Parce qu'il est un ressort Bean, je compris que je devrais utiliser l'annotation @MockBean dans mon test de cette façon:

public class ControllerIT extends ITBase { 

@MockBean 
private FileGenerator fileGenerator; 

@Test 
@Transactional 
public void testSomeTest() { 
... 

Mon problème est:

Si je lance la classe de test donné , tous les tests passent. Cependant, si je cours toutes les classes de test, j'obtiens un UnableToRegisterMBeanException. Le stacktrace ressemble à ceci:

java.lang.IllegalStateException: Failed to load ApplicationContext 

at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) 
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83) 
at org.springframework.boot.test.autoconfigure.AutoConfigureReportTestExecutionListener.prepareTestInstance(AutoConfigureReportTestExecutionListener.java:49) 
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
at org.junit.runners.Suite.runChild(Suite.java:128) 
at org.junit.runners.Suite.runChild(Suite.java:27) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51) 
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 
Caused by: org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [o[email protected]607624b7] with key 'environmentManager'; nested exception is javax.management.InstanceAlreadyExistsException: com.gd.configurationrepository:name=environmentManager,type=EnvironmentManager 
at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:625) 
at org.springframework.jmx.export.MBeanExporter.registerBeans(MBeanExporter.java:550) 
at org.springframework.jmx.export.MBeanExporter.afterSingletonsInstantiated(MBeanExporter.java:432) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:796) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) 
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) 
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) 
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369) 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:313) 
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:111) 
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98) 
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116) 
... 31 more 
Caused by: javax.management.InstanceAlreadyExistsException: com.gd.configurationrepository:name=environmentManager,type=EnvironmentManager 
at com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:437) 
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerWithRepository(DefaultMBeanServerInterceptor.java:1898) 
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:966) 
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:900) 
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:324) 
at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522) 
at org.springframework.jmx.support.MBeanRegistrationSupport.doRegister(MBeanRegistrationSupport.java:195) 
at org.springframework.jmx.export.MBeanExporter.registerBeanInstance(MBeanExporter.java:678) 
at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:615) 
... 43 more 

* Je ne Hikari ou que ce soit. Juste un simple générateur de fichiers, service et contrôleur.

Répondre

1

Votre cause principale est que vous essayez de réinstituer un MBean. Assurez-vous de l'instancier une fois pour l'ensemble des tests au lieu d'une fois par test (déplacez probablement @MockBean vers ITBase et supprimez toutes les sous-classes). Le message d'erreur est

javax.management.InstanceAlreadyExistsException: com.gd.configurationrepository:name=environmentManager,type=EnvironmentManager at com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:437) 
+0

Cela a résolu le problème. Merci. – Marcell