Bitronix + Spring测试+不同的弹簧轮廓

时间:2015-02-27 13:26:06

标签: spring unit-testing spring-test bitronix

我有几个测试,它们都扩展了定义Spring测试应用程序上下文的相同根测试。我的一个测试使用了不同的配置文件,所以我用@ActiveProfiles("specialTestProfile")注释了子类,这个配置文件创建了一个特殊的模拟bean,它在上下文中注入。我想在执行此测试之前和之后清除我的上下文,但我没有找到正确的方法来执行此操作。我知道Spring测试框架做了一些上下文缓存,在我的情况下我应该有两个不同的上下文,它不应该重新加载上下文但是因为bitronix不能正常工作,如果我不这样做会产生这个奇怪的错误清理上下文:

    Caused by: bitronix.tm.resource.ResourceConfigurationException: cannot create JDBC datasource named unittestdb
    at bitronix.tm.resource.jdbc.PoolingDataSource.init(PoolingDataSource.java:57)
    at sun.reflect.GeneratedMethodAccessor404.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1608)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1549)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)
    ... 62 more
Caused by: java.lang.IllegalArgumentException: resource with uniqueName 'unittestdb' has already been registered
    at bitronix.tm.resource.ResourceRegistrar.register(ResourceRegistrar.java:55)
    at bitronix.tm.resource.jdbc.PoolingDataSource.buildXAPool(PoolingDataSource.java:68)
at bitronix.tm.resource.jdbc.PoolingDataSource.init(PoolingDataSource.java:53)
... 68 more

即使我为每个测试类重新加载上下文(通过用@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)注释我的父类,我仍然会在某个时候得到上面的错误...你知道如何解决这个问题吗? / p>

1 个答案:

答案 0 :(得分:1)

如果没有看到PoolingDataSource的确切配置,我就无法确切知道如何解决您的问题。

但是,您似乎可以通过调用PoolingDataSource方法创建具有唯一名称的setUniqueName()来解决此问题(如果您使用Java,则使用@Bean方法配置)或设置uniqueName属性(如果您使用的是XML配置)。如何生成唯一名称取决于您使用的配置样式。

如果没有为创建ApplicationContext bean的每个PoolingDataSource设置唯一名称,您将继续看到异常,告诉您无法使用“unittestdb”名称创建第二个池因为它已经存在。原因是init()中的PoolingDataSource方法委托给ManagementRegistrar.register(),在{em>唯一名称下注册了MBean,并且MBeanServer用于同一JVM进程中的所有测试(即,套件中的所有测试)。

不是为每个应用程序上下文生成唯一的池名称,另一个选项可能是通过将bitronix.tm.disableJmx属性设置为false来禁用JMX。有关详细信息,请参阅isDisableJmx()中的setDisableJmx()bitronix.tm.Configuration方法。