相同的Java单元测试在普通Java项目和Android项目中返回不同的结果

wdebmtf2  于 2023-01-03  发布在  Android
关注(0)|答案(1)|浏览(164)

我有一个普通的旧Java项目,其中有一个简单的Java类,它有一个验证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类移植到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项目中运行相同的测试时,第二个测试方法jsonStringIsInvalid()通过了,即使我给予它一个无效的JSON字符串!
这里我去掉了开始和结束的花括号,故意使它成为一个无效的JSON字符串,但是正如您所看到的,测试还是通过了。

在Java项目中运行相同的测试,工作如预期。我在jsonStringIsInvalid()方法中添加了assertTrue,以便在本示例中故意显示错误。

代码、JUnit版本都是一样的,唯一不同的是我用IntelliJ运行Java项目,用Android Studio运行Android项目。
我不知道为什么会发生这种情况。我希望任何帮助了解这一点。我已经上传了下面的代码,如果有帮助的话。
Java project|Android project

h5qlskok

h5qlskok1#

发现问题。显然默认情况下与Android SDK捆绑在一起的JSON-Java库在测试模块中不可用。
因此,我将库的testImplementation显式添加到我的Gradle文件中。

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

单元测试现在按预期工作。
Source

相关问题