簡體   English   中英

如何使用 Junit 5 測試服務提供者實現模塊?

[英]How can I test a service provider implementation module with Junit 5?

這是我的基本模塊,它需要 myspi 包中定義的接口的實現。 各種提供者可以提供 MyProvider 實現。 基本模塊通過 myspi.MyProvider 接口實現使用它們。

module base {
    exports myspi;
    uses myspi.MyProvider;
}

這是我的示例實現模塊,它通過 MyProviderImpl 提供 MyProvider 實現

module myspi.provider {
    provides myspi.MyProvider with myspi.provider.MyProviderImpl;
}

當我在基本模塊中加載實現時,所有這些都可以正常工作,

public static List<MyProvider> getMyProviders() {
        var myProviders = new ArrayList<MyProvider>();
        for (MyProvider myProvider : ServiceLoader.<MyProvider>load(MyProvider.class)) {
            myProviders.add(myProvider);
        }
        return myProviders;
    }

但是相同的代碼在 Junit 5 測試代碼中返回空列表(ServiceLoader 返回 null)。 如何使用 Junit 5 測試服務提供者模塊。或者是否有任何替代 Junit 允許我們創建測試模塊(模塊化測試 API),在模塊信息中聲明“使用 myspi.MyProvider”並與 getMyProviders( )?

基本上,您在正確的道路上。 您需要說服Java模塊系統,當您將模塊解析為測試運行時時,測試模塊才是最重要的。

黑匣子測試很容易。

在模塊化世界中進行白盒測試,這意味着測試模塊中受保護的成員和打包私有成員非常棘手。 至少有兩種方法可以實現此目的:a)使用Java命令行選項在測試啟動時配置Java模塊系統,或b)在編譯時將主要源混合到測試源中,並在您的module-info.java中維護專用的module-info.java測試源。

請訪問博客和示例發布的鏈接,這些博客和示例發布於如何使用jdk> 1.8進行模塊化構建。為方便起見,摘錄如下:

例子

背景和其他資源

並且希望大多數IDE也不支持您。 目前。

解決了!

我已經將Jun​​it從類路徑刪除到模塊路徑,還刪除了所有Junit 4兼容性東西,例如RunWith()等,並進行了純Junit 5測試。

我添加了一個module-info.java(Junit 5不需要打開模塊,盡管書中講的相反)

在對測試進行模塊化之后,我發現它仍然沒有執行ServiceLoader的東西。 然后,我自己開始尋找故障。

我找到了! 可以在基本模塊中運行ServiceLoader東西,因為基本模塊引用了導出的myProvider.jar,而后者又訪問了同一目錄中的myProvider-config.properties文件。 沒有此配置文件,myProvider將無法正常工作。

另一方面,有問題的測試模塊引用了myProvider的eclipse項目,而不是其導出的.jar文件,因此找不到其配置文件並退出。 我已經將該配置文件從Netbeans移至Eclipse,只需將其復制到同一目錄中即可。 因此缺少配置文件是問題所在。

更改項目設置,我可以毫無問題地運行測試。

我要感謝所有答復的人員。

這是一篇很老的帖子,但如果有人來到這里,gradle mudules 插件會處理一切: https : //github.com/java9-modularity/gradle-modules-plugin

暫無
暫無

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

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