繁体   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