当前位置: 首页 > 知识库问答 >
问题:

使用mockMVC的Hamcrest:检查键是否存在,但值可能为null

狄鸿禧
2023-03-14

我正在用MockMvc做一些测试,我想验证JSON响应的结构。具体地说,我希望确保某个属性的键存在,并且该值是某种类型或NULL。

{
   "keyToNull": null,  # This may be null, or a String
   "keyToString": "some value"
}
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.hamcrest.Matchers.*;

.andExpect(jsonPath("$").value(hasKey("keyToNull")))
.andExpect(jsonPath("$.keyToNull").value(
                  anyOf(any(String.class), nullValue(String.class))))

.andExpect(jsonPath("$").value(hasKey("keyToString")))
.andExpect(jsonPath("$.keyToString").value(
                  anyOf(any(String.class), nullValue(String.class))))
.andExpect(jsonPath("$.notAKey").value(
                  anyOf(any(String.class), nullValue(String.class)))) // ok
private static <T> void assertNullableAttr(ResultActions res, String jsonPath, Class<T> type) throws Exception {
    int split = jsonPath.lastIndexOf('.');
    String prefix = jsonPath.substring(0, split), key = jsonPath.substring(split+1);

    res.andExpect(jsonPath(prefix).value(hasKey(key)))
        .andExpect(jsonPath(jsonPath).value(anyOf(any(type), nullValue(type))));
    }
ResultActions res = mockMvc.perform(get("/api"))
    // these attributes must not be null
    .andExpect(jsonPath("$.someInfo").value(hasSize(2)))
        .andExpect(jsonPath("$.someInfo[0].info1").value(any(String.class)))
        .andExpect(jsonPath("$.someInfo[0].info2").value(any(String.class)))
    .andExpect(jsonPath("$.addlInfo").value(hasSize(2)))
        .andExpect(jsonPath("$.addlInfo[0].info1").value(any(String.class)))
        .andExpect(jsonPath("$.addlInfo[0].info2").value(any(String.class)));

// these attributes may be null
assertNullableAttr(res, "$.someInfo[0].info3", String.class);
assertNullableAttr(res, "$.someInfo[0].info4", String.class);

assertNullableAttr(res, "$.addlInfo[0].info3", String.class);
assertNullableAttr(res, "$.addlInfo[0].info4", String.class);

是否有任何聪明的Hamcrest匹配器可以应用于每个属性的单个json路径?

共有1个答案

关浩壤
2023-03-14

可以使用以下现有测试类执行此操作:

.andExpect(jsonPath("$..myExpectedNullKey[0]").value(IsNull.nullValue()));

一定要导入org.hamcrest.core.isnull

 类似资料:
  • 问题内容: 我想知道是否有人知道使用和检查列表是否为空的方法? 我看到的最好方法就是使用JUnit: 但是我希望在Hamcrest有某种方法可以做到这一点。 问题答案: 好吧,总有 …但是我想那不是你的意思:) 或者: 在该类中是静态的。请注意,必须将转换为,这要归功于Hamcrest 1.2强大的泛型。 hamcrest 1.3可以使用以下进口产品

  • 问题内容: 如何检查扫描仪中写入的值是否存在? 问题答案: 只需使用ArrayList.contains(desiredElement)即可。例如,如果您要从示例中查找conta1帐户,则可以使用以下方法: 编辑: 请注意,为了使其正常工作,您将需要适当地重写equals()和hashCode()方法。如果使用的是Eclipse IDE,则可以通过首先打开对象的源文件并选择来生成这些方法。

  • 问题内容: 因此,我从服务器获取了一些JSON值,但我不知道是否会有特定的字段。 像这样: 有时,还会有一个额外的字段,例如: 我想检查名为“ club”的字段是否存在,以便在解析时不会得到 org.json.JSONException:club的值 问题答案: JSONObject类具有一个名为“ has”的方法: http://developer.android.com/reference/o

  • 问题内容: 我有一个这样声明的JS对象 我还有一个$ http请求,该请求用项目填充此对象。我想检测该项目是否为空,看来ng-show支持此项目。我输入 而且它神奇地起作用了,我也想从控制器上做同样的事情,但是我似乎无法使它起作用,看来我可能不得不遍历该对象以查看它是否具有任何属性,或者使用lodash或下划线。 还有其他选择吗? 我确实尝试过 但在创建对象并填充时,它始终返回false,因此它不

  • firebase中是否有方法可以检查DB中是否存在值?Firebase有方法。exists(),但根据文档,它只检查键。 我有以下结构: 我想检查是否存在值为U1EL5623的ID。

  • 上面是我正在处理的JSON对象。我想检查键是否存在。我尝试了下面的代码,但它不起作用。有办法实现吗?