簡體   English   中英

使用ClassPathScanningCandidateComponentProvider時,Spring Boot Unittest給出NoClassDefFoundError

[英]Spring boot unittest gives NoClassDefFoundError when using ClassPathScanningCandidateComponentProvider

我有一個帶有自定義過濾器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')

我該怎么解決?

找到了解決方案。

顯然,“ 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM