android,为什么转换为 kotlin 后单元测试失败

android, why after covert to kotlin the unit test fail

在 android 应用上,具有 java 功能

JSONObject addToJson(@NonNull JSONObject jsonObject, @NonNull String key, boolean value){
        try {
            jsonObject.put(key, value);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return jsonObject;
    }

测试代码,它在调用 mock jsonObject.put(key, value) 时抛出并且工作正常:

    @Test
    public void test_addToJson() throws JSONException {
        JSONObject jsonObject = Mockito.spy(new JSONObject());
        Mockito.when(jsonObject.put(anyString(), anyBoolean())).thenThrow(new JSONException("!!! test forced exception"));
        JSONObject outputObject = addToJson(jsonObject, "null", true);
        assertEquals("jsonobject length should match", 0, outputObject.length());
    }

转换为 kotlin 后

    fun addToJson(jsonObject: JSONObject, key: String, value: Boolean?): JSONObject {
        try {
            jsonObject.put(key, value)
        } catch (e: JSONException) {         
            e.printStackTrace()
        }
        return jsonObject
    }

测试失败,没有抛出异常。

Java 代码对 value 使用原始类型 boolean。 Kotlin 版本使用可空类型 Boolean? 这似乎是不必要的,因为在 Java 版本中参数永远不会是 null

更改为可空类型可能会导致 anyBoolean 匹配器失败。您可以尝试切换到不可为 null 的类型 Boolean,或者继续使用 Boolean? 并将 anyBoolean 匹配器从 mockito-kotlin 更改为 anyOrNull