使用ClassPathScanningCandidateComponentProvider时,Spring Boot Unittest给出NoClassDefFoundError

时间:2018-11-14 15:42:12

标签: java spring spring-boot

我有一个带有自定义过滤器FilterRegistrationBean的Spring-boot应用程序。

创建此过滤器时,在bean实例化期间,我尝试使用一些代码在类路径中搜索特定类型的所有注释。

ClassPathScanningCandidateComponentProvider provider = createComponentScanner();
provider.findCandidateComponents("").stream()...

对findCandidateComponents的调用将引发NoClassDefFoundError。

该应用程序在正常运行期间可以运行,但是在单元测试中失败。我的测试课程如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class YadaYadaApplicationTests
{
    @Test
    public void contextLoads()
    {
    }
}

如果我注释掉“ @SpringBootTest”,我可以正常运行。

我想是这样,因为运行单元测试时的类路径与我单独运行应用程序时的类路径不同。

这些是我的依赖项:

implementation('org.springframework.boot:spring-boot-starter-web')
testImplementation('org.springframework.boot:spring-boot-starter-test')

该如何解决?

1 个答案:

答案 0 :(得分:0)

找到了解决方案。

显然,“ org.springframework.boot:spring-boot-starter-test”需要更多的依赖关系,这些依赖关系不是可传递的。

猜测原因可能是我使用ClassPathScanningCandidateComponentProvider手动扫描了类路径,它将加载依赖类,而不是类路径。

添加以下内容可以解决我的问题:

build.gradle:

testImplementation('org.springframework.boot:spring-boot-starter-jdbc')
testImplementation('org.apache.derby:derby')

application.properties:

spring.datasource.driver-class-name=org.apache.derby.jdbc.EmbeddedDriver