Jdv*_*Jdv 7 java junit spring unit-testing maven
我有一个测试类,它看起来像这样:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestClass.TestConfig.class)
public class TestClass{
@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages = "package.with.dummy.provider.and.aspect", includeFilters = {
@Filter(Aspect.class), @Filter(Provider.class) })
public static class TestConfig {
@Bean
CustomApplicationListener listener() {
return new CustomApplicationListener ();
}
}
@Autowired
CustomApplicationListener listener;
@Test
public void testMethod() {
// Do something with the listener
}
}
Run Code Online (Sandbox Code Playgroud)
当我从 Eclipse 使用 JUnit 运行它时,它工作得很好。但是在我的 Maven 构建/测试周期中执行测试时,它失败并出现以下异常:
java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)
[...]
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [Path\To\Aspect\DummyAspect.class]; nested exception is java.nio.channels.ClosedByInterruptException
at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:454)
[...]
Caused by: java.nio.channels.ClosedByInterruptException
[java] at java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:220)
[java] at sun.nio.ch.FileChannelImpl.size(FileChannelImpl.java:327)
[java] at sun.nio.ch.ChannelInputStream.available(ChannelInputStream.java:128)
[java] at java.io.BufferedInputStream.available(BufferedInputStream.java:421)
[java] at org.springframework.asm.ClassReader.readClass(ClassReader.java:479)
[java] at org.springframework.asm.ClassReader.<init>(ClassReader.java:445)
[java] at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:54)
[java] at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:103)
[java] at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:123)
[java] at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:430)
Run Code Online (Sandbox Code Playgroud)
我想知道从 Eclipse 执行测试与从 maven 执行测试的差异,这可能会导致观察到的情况发生。
更新basePackages = "package.with.dummy.provider.and.aspect"从@ComponentScan注释中
删除时,一切都按预期工作!不过包路径是正确的。现在,如果有人能解释为什么会发生这种情况......
更新 2
看起来更奇怪了。一些测试后,我可以证实,测试通过后,每当我改变的价值basePackages。在我删除该值并且测试通过的第一次更新之后,它在文本时间和之后的每次都失败了。然后我尝试将值更改为package.with.dummy.provider.and,删除一个级别,并且它通过了 - 一次。听起来可能是 maven 在构建和测试过程中生成的某些文件没有正确清理,因此@ComponentScan查找并尝试多次读取文件,导致ClosedByInterruptException.
小智 0
我遇到了同样的问题,解决方案如下。
现在spock框架已经支持JUnit 5,现在您可以使用JUnit 5运行spock测试用例。
将您的 spock 升级到最新版本 [ 2.0-M1-groovy-2.5(尚未发布,但我们现在可以使用解决方案)]
并将以下新依赖项添加到您的项目中。
testCompile group: 'org.junit.platform', name: 'junit-platform-engine', version: '1.5.2'
compile group: 'org.junit.platform', name: 'junit-platform-commons', version: '1.5.2'
Run Code Online (Sandbox Code Playgroud)
现在运行您的gradle test任务,它将同时运行 spock 和 JUnit5 测试用例而不会失败。
快乐编码...:)