Bitronix + Spring 测试 + 不同的 spring 配置文件
Bitronix + Spring tests + Different spring profiles
我有几个测试,它们都扩展了定义 Spring 测试应用程序上下文的相同根测试。我的一个测试使用了不同的配置文件,所以我用 @ActiveProfiles("specialTestProfile")
注释了 child class,这个配置文件创建了一个特殊的模拟 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
即使我重新加载每个测试的上下文 class(通过用 @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
注释我的 parent class,我仍然会在某些时候得到上面的错误。 .. 你知道如何解决这个问题吗?
没有看到您对 PoolingDataSource
的确切配置,我无法确切知道如何解决您的问题。
但是,您似乎可以通过调用 setUniqueName()
方法(在 @Bean
方法中,如果您使用 Java 配置)或设置 uniqueName
属性(如果您使用 XML 配置)。如何生成唯一名称取决于您使用的配置样式。
如果您没有为创建 PoolingDataSource
bean 的每个 ApplicationContext
设置唯一的名称,您将继续看到异常告诉您无法使用 [= 创建第二个池37=] 名称,因为它已经存在。原因是 PoolingDataSource
中的 init()
方法委托给 ManagementRegistrar.register()
,它在 唯一名称 下注册了一个 MBean
,并且相同MBeanServer
用于同一 JVM 进程中的所有测试(即,用于套件中的所有测试)。
不是为每个应用程序上下文生成唯一的池名称,另一种选择可能是通过将 bitronix.tm.disableJmx
属性 设置为 false
来禁用 JMX 的使用。有关详细信息,请参阅 bitronix.tm.Configuration
中的 isDisableJmx()
和 setDisableJmx()
方法。
我有几个测试,它们都扩展了定义 Spring 测试应用程序上下文的相同根测试。我的一个测试使用了不同的配置文件,所以我用 @ActiveProfiles("specialTestProfile")
注释了 child class,这个配置文件创建了一个特殊的模拟 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
即使我重新加载每个测试的上下文 class(通过用 @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
注释我的 parent class,我仍然会在某些时候得到上面的错误。 .. 你知道如何解决这个问题吗?
没有看到您对 PoolingDataSource
的确切配置,我无法确切知道如何解决您的问题。
但是,您似乎可以通过调用 setUniqueName()
方法(在 @Bean
方法中,如果您使用 Java 配置)或设置 uniqueName
属性(如果您使用 XML 配置)。如何生成唯一名称取决于您使用的配置样式。
如果您没有为创建 PoolingDataSource
bean 的每个 ApplicationContext
设置唯一的名称,您将继续看到异常告诉您无法使用 [= 创建第二个池37=] 名称,因为它已经存在。原因是 PoolingDataSource
中的 init()
方法委托给 ManagementRegistrar.register()
,它在 唯一名称 下注册了一个 MBean
,并且相同MBeanServer
用于同一 JVM 进程中的所有测试(即,用于套件中的所有测试)。
不是为每个应用程序上下文生成唯一的池名称,另一种选择可能是通过将 bitronix.tm.disableJmx
属性 设置为 false
来禁用 JMX 的使用。有关详细信息,请参阅 bitronix.tm.Configuration
中的 isDisableJmx()
和 setDisableJmx()
方法。