我的Spring应用程序有一个bean:
@Configuration
public class JmxRmiConfig {
@Value("${jmx.rmi.host:localhost}")
private String rmiHost;
@Value("${jmx.rmi.port:1099}")
private Integer rmiPort;
@Bean
public RmiRegistryFactoryBean rmiRegistry() {
final RmiRegistryFactoryBean rmiRegistryFactoryBean = new RmiRegistryFactoryBean();
rmiRegistryFactoryBean.setPort(rmiPort);
rmiRegistryFactoryBean.setAlwaysCreate(true);
return rmiRegistryFactoryBean;
}
@Bean
@DependsOn("rmiRegistry")
public ConnectorServerFactoryBean connectorServerFactoryBean() throws Exception {
final ConnectorServerFactoryBean connectorServerFactoryBean = new ConnectorServerFactoryBean();
connectorServerFactoryBean.setObjectName("connector:name=rmi");
connectorServerFactoryBean.setServiceUrl(String.format("service:jmx:rmi://%s:%s/jndi/rmi://%s:%s/jmxrmi", rmiHost, rmiPort, rmiHost, rmiPort));
return connectorServerFactoryBean;
}
}我有两个单元测试,两个单元测试都是这样注释的:
@AutoConfigureMockMvc
@SpringBootTest
@Unroll
class ... extends Specification { ... }(展开和规范都来自spock.lang)
当我使用maven/surefire一起运行它们时,第二个测试类失败了,出现了以下错误:
创建名称为“org.springframework.beans.factory.BeanCreationException:”的bean (类路径资源uk/ac/prospects/hedd/api/config/JmxRmiConfig.class:调用init方法失败)错误;嵌套异常为java.rmi.server.ExportException:内部错误:已在使用的ObjID
它似乎再次为第二个类重新创建RmiRegistry,而不破坏第一个类。
由于没有@AutoConfigureMockMvc的其他测试运行良好,我的假设是@AutoConfigureMockMvc触发了问题。
我怎样才能让两个测试一起运行?
发布于 2019-01-11 12:37:05
下面的额外配置,为我们解决了这个问题。
<forkCount>1</forkCount>
<reuseForks>false</reuseForks>不理解100%的问题,但我们添加了上面的内容,因为测试套件在一个测试中被模拟但在另一个测试中正确配置的Spring之间出现了混淆。这也解决了RMI问题。我认为这为每个测试提供了一个干净的Spring上下文。
发布于 2019-01-14 10:04:30
我还没有对此进行测试,但认为使用Spring注释@DirtiesContext:https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#spring-testing-annotation-dirtiescontext可能有一个解决方案
https://stackoverflow.com/questions/53815303
复制相似问题