0

我有几个测试都扩展了定义 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),我仍然会在某些时候收到上述错误......你知道如何解决这个问题吗?

4

1 回答 1

1

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

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

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

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

于 2015-02-28T02:43:11.610 回答