簡體   English   中英

相同的 Java 單元測試在普通 Java 項目和 Android 項目中返回不同的結果

[英]Same Java unit test returning different results in a plain Java project and an Android project

我有一個普通的舊 Java 項目,其中有一個簡單的 Java class,它具有驗證 JSON 字符串的方法。

public class Validator {
    public boolean isJSONValid(String jsonString) {
        try {
            new JSONObject(jsonString);
        } catch (JSONException ex) {
            try {
                new JSONArray(jsonString);
            } catch (JSONException ex1) {
                return false;
            }
        }
        return true;
    }
}

我從 Gradle 文件中添加了 JUnit 5 來為此方法編寫單元測試。

test {
    useJUnitPlatform()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter:5.9.0'
    implementation 'org.json:json:20220924'
}

這是單元測試。

class ValidatorTest {
    @Test
    void jsonStringIsValid() {
        Validator validator = new Validator();
        String json =
                "{" +
                        "   \"name\":\"John\"," +
                        "   \"age\":15," +
                        "   \"gender\":\"M\"" +
                        "}";
        Assertions.assertTrue(validator.isJSONValid(json));
    }

    @Test
    void jsonStringIsInvalid() {
        Validator validator = new Validator();
        String json =
                        "   \"name\":\"John\"," +
                        "   \"age\":15," +
                        "   \"gender\":\"M\"";
        Assertions.assertFalse(validator.isJSONValid(json));
    }
}

單元測試正確通過,這里一切都很好。

然后我將相同的 Java class 移植到 Android 項目(使用 Java)並再次添加 JUnit 5 並在那里也添加了相同的單元測試。

dependencies {
    implementation 'androidx.appcompat:appcompat:1.5.1'
    implementation 'com.google.android.material:material:1.7.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1'
    androidTestImplementation 'androidx.test.ext:junit:1.1.4'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
}

tasks.withType(Test) {
    useJUnitPlatform()
}

但奇怪的是,當我在 Android 項目中運行相同的測試時,即使我給它一個無效的 JSON 字符串,第二個測試方法jsonStringIsInvalid()通過了!

在這里,我刪除了開始和結束大括號,故意使其成為無效的 JSON 字符串。 但如您所見,測試仍然通過了。

在此處輸入圖像描述

相同的測試在 Java 項目中運行,按預期工作。 為了這個例子,我在jsonStringIsInvalid()方法中添加了assertTrue來故意顯示錯誤。

在此處輸入圖像描述

代碼,JUnit版本都是一樣的。 唯一不同的是我使用 IntelliJ 運行 Java 項目,使用 Android Studio 運行 Android 項目。

我不確定為什么會這樣。 如果能幫助理解這一點,我將不勝感激。 如果有幫助,我已經上傳了下面的代碼。

Java 項目| Android項目

發現了問題。 顯然,默認情況下與 Android SDK 捆綁在一起的 JSON-Java 庫在測試模塊中不可用。

所以我明確地將庫的testImplementation添加到我的 Gradle 文件中。

dependencies {
    testImplementation 'org.json:json:20220924'
}

並且單元測試現在按預期工作。

資源

暫無
暫無

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

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