我不确定这是嵌入式mongo问题还是弹簧配置问题,也许其他人遇到了同样的问题。
我在Intellij中设置了一个spring + maven项目,并在测试范围内嵌入了mongo。
问题:当我右键单击测试java文件夹以运行所有测试时,我得到了可怕的应用程序上下文错误(详见下文)。然而,单独运行测试,甚至包装都很好。我发现有一个测试(巧合是在整个集合中运行的第一个)导致中断,如果我删除它,我可以再次运行所有测试。我们称之为TestA
。我想了解为什么这一项测试会导致所有其他测试失败,以及如何修复它(因为我真的很想进行测试!)。
所有测试都扩展了一个以此为基础的基类( {/ 1}}的除外):
TestA
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {Config.class, MongoConfig.class})
@WebAppConfiguration
@IntegrationTest("${port}")
@Component
略有不同,因为它不需要运行Mongo,但确实需要spring来自动装配服务。我认为这样可以,但不是:
TestA
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {Config.class})
@Component
只是注释:
MongoConfig.class
加上用于创建mongo进程的@Configuration
@EnableAutoConfiguration(exclude = { EmbeddedMongoAutoConfiguration.class })
@EnableMongoRepositories(basePackages = "<my package>")
。
@Bean
有这些注释并且空体:
Config.class
但是,如果我尝试运行所有测试,它们都会失败并出现以下错误:
@Configuration
@EnableAutoConfiguration(exclude = {EmbeddedMongoAutoConfiguration.class})
@ComponentScan(value = {<list of packages>})
@EnableMongoRepositories(basePackages = {"my package"})
我的理解是,通过添加 java.lang.IllegalStateException: Failed to load ApplicationContext
<huge stack trace eventually ending with...>
Caused by: java.nio.file.FileAlreadyExistsException: C:\Users\john\AppData\Local\Temp\extract-john-extractmongod.exe
at sun.nio.fs.WindowsFileCopy.copy(WindowsFileCopy.java:124)
at sun.nio.fs.WindowsFileSystemProvider.copy(WindowsFileSystemProvider.java:278)
at java.nio.file.Files.copy(Files.java:1274)
at de.flapdoodle.embed.process.extract.ExtractedFileSets.copy(ExtractedFileSets.java:54)
at de.flapdoodle.embed.process.store.ExtractedArtifactStore.extractFileSet(ExtractedArtifactStore.java:110)
at de.flapdoodle.embed.process.runtime.Starter.prepare(Starter.java:56)
... 192 more
嵌入式mongo以某种方式尝试每次都启动它?
我的临时解决方案是删除TestA
中的注释并扩展上述基类。这使得一切正常,但并不是真的正确。我需要的是TestA
上的正确注释,以便它与其他测试协同工作。
依赖关系
TestA
弹簧配置
我没有使用xml文件,而是设置了与yml文件绑定的类配置文件(在Intellij中添加到模块的facet)。