簡體   English   中英

如何測試使用JAR的Java代碼?

[英]How do I test Java code that uses JAR?

我有使用JAR的Java代碼:

public class Version {
   public String getVersion() {
        // Use Java Package API to return information specified in the manifest of this JAR.
        return getClass().getPackage().getImplementationVersion();
    }
}

如何為此代碼運行JUnit測試?

由於尚無JAR文件,因此它在開發構建中(在Eclipse中)失敗。

由於沒有JAR文件,因此無法在生產版本中(在Gradle中)。

您始終需要模擬依賴項以進行單元測試。 邊界是單元測試您的代碼,而不是jar本身。 Mockito框架很好,還有其他框架可以完成任務。

很有可能無法正確模擬(因此:未經單元測試)。 關鍵是您實際上是在“ this”上調用方法。 但是您不能測試某些對象……並同時對其進行模擬。

您會看到,如果您的生產代碼如下所示:

public String getVersion() {
    return someObject.getClass().....
}

然后可以創建一個模擬對象; 並將其插入到Version類中。 但是即使那樣,方法getClass()在java.lang.Object中還是最終的 因此,無論如何您都不能嘲笑它。

[諸如EasyMock或Mokito之類的合理的模擬框架通過擴展類並覆蓋要控制的方法來工作。 像PowerMock這樣的框架可以進行字節碼操作,並允許進行這種模擬-但是您永遠都不要使用此類庫。 因為它們確實有嚴重的副作用(例如破壞大多數coverage庫)]

可能有效的方法:

class Version {
    private final Package packageForVersionCheck;

    public Version() {
      this(getClass().getPackage()));
    }
    Version(Package somePackage) {
      this.packageForVersionCheck = ...
    }

    public String getVersion() {
      return this.packageForVersionCheck.getImpl....

現在,您可以使用依賴項注入來提供一個返回該字符串的“模擬”包。 但是,看起來好像很多代碼幾乎沒有收獲。

長話短說:有時,您根本無法編寫合理的單元測試。 然后做下一個最好的事情:創建一些“功能”測試,該測試將在“類似於客戶的設置”中自動執行; 並確保您也有自動設置來運行此類測試。

暫無
暫無

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

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