我有一个普通的旧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
1条答案
按热度按时间h5qlskok1#
发现问题。显然默认情况下与Android SDK捆绑在一起的JSON-Java库在测试模块中不可用。
因此,我将库的
testImplementation
显式添加到我的Gradle文件中。单元测试现在按预期工作。
Source