Тест с аннотациями Spring вызывает ClosedByInterruptException при выполнении в тестовом прогоне maven - PullRequest
4 голосов
/ 24 мая 2019

У меня есть тестовый класс, который выглядит так:

@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
    }    
}

Когда я запускаю его с JUnit из Eclipse, он работает просто отлично. Но когда тест выполняется в моем цикле сборки / тестирования 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)

Мне бы хотелось узнать о различиях в выполнении тестов Eclipse и Maven, которые могут привести к возникновению наблюдаемой ситуации.

Обновление При удалении basePackages = "package.with.dummy.provider.and.aspect" из аннотации @ComponentScan все работает как положено! Путь к пакету правильный, хотя. Если бы кто-то мог объяснить, почему это происходит ...

Обновление 2 Ну, похоже, это даже незнакомо. После еще нескольких тестов я могу подтвердить, что тест проходит один раз всякий раз, когда я изменяю значение basePackages. После первого обновления, в котором я удалил значение и тест прошел успешно, он провалил текстовое время и каждый раз после этого. Затем я попытался изменить значение на package.with.dummy.provider.and, удалив один уровень, и оно прошло - один раз. Похоже, что некоторые файлы, сгенерированные maven в процессе сборки и тестирования, не очищены должным образом, поэтому @ComponentScan находит и пытается прочитать файлы несколько раз, что вызывает ClosedByInterruptException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...