簡體   English   中英

使用 maven 的 mockito-core v3.6.0 的奇怪行為

[英]strange behaviour with mockito-core v3.6.0 using maven

我正在使用 mockito-core 依賴版本 3.6.0,使用 maven 作為我們的依賴管理器。 我觀察到相同版本的 mockito-core 用於“編譯”依賴 scope 用於“objenesis” jar

+- org.mockito:mockito-core:jar:3.6.0:test
[INFO] |  +- net.bytebuddy:byte-buddy:jar:1.10.11:test
[INFO] |  +- net.bytebuddy:byte-buddy-agent:jar:1.10.11:test
[INFO] |  \- org.objenesis:objenesis:jar:3.1:compile

但突然之間,它已將 scope 更改為“測試”以進行“目標”

+- org.mockito:mockito-core:jar:3.6.0:test
[INFO] |  +- net.bytebuddy:byte-buddy:jar:1.10.11:test
[INFO] |  +- net.bytebuddy:byte-buddy-agent:jar:1.10.11:test
[INFO] |  \- org.objenesis:objenesis:jar:3.1:test

這顯然對我們的應用程序中的依賴注入造成了重大問題,因為我們使用 cglib 為 bean 創建代理。

什么可能導致 scope 對於 mockito-core 的相同版本依賴項的變化?

來自dependency:tree目標的output 可能非常具有誤導性:它輸出的詳細信息基於Maven 對已解析依賴項的內部表示,並且只列出每個依賴項一次,即使這些依賴項是通過多個路徑包含的。 可以使用更好的可視化效果,例如在您最喜歡的 IDE 中。

我不確定究竟是什么導致了您的問題,但它可能與 Mockito 中的更改無關:如果您對模塊有測試范圍依賴,那么它的編譯范圍依賴會被傳遞包含為測試-范圍到你的項目。 您的問題中顯示的確切配置在 Maven 中是不可能的(這只是來自依賴關系的誤導性 output:樹)。 很可能其他一些編譯范圍依賴項也對 objenesis 有依賴關系,而其他依賴項已被刪除或更改,並且不再具有該依賴項。

如果你直接依賴一個依賴,你應該在適當的 POM 中將它聲明為一個依賴,而不是依賴它被一個不相關的依賴傳遞地包含。 您應該確保直接需要對象的任何組件都具有對對象的編譯(或運行時)scope 依賴性。

Mockito-core 在compile scope 時聲明了 objenesis,因為它需要它來編譯。 但是,當您將test scope 中的 mockito-core 添加到另一個項目時,所有這些compile scope 的依賴項都會變成test scope。

但是,如果您在compile scope 並且版本低於 mockito-core 的其他地方有對象,則對象將返回compile scope 並且來自 mockito-core 的版本是更高版本,這是選定的版本。

找出誰在提供其他對象的一種解決方案是從 mockito-core 中排除對象並檢查它在依賴項中出現的位置:樹。

Objenesis 經常用於compile scope。 以 Spring 為例。 您可以在runtime scope 中添加顯式對象依賴關系,以從項目的角度獲得正確的 scope。 像您的項目不直接使用的許多其他依賴項一樣。 但是保持清潔是很多工作。

暫無
暫無

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

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