AssertJ能否验证值为特定数据类型?类型校验实现方案咨询
用AssertJ验证JSON响应值类型的正确姿势
嘿,我明白你的困扰——直接把JsonPath结果转成long会把原始类型信息抹掉,自然没法用AssertJ直接断言它是不是Long或者不是Double。下面给你两个实用的解决办法:
方法一:保留原始对象,直接断言类型
别着急把JsonPath的结果转成long,先获取原始的Object对象,这样就能拿到JSON返回的真实类型,然后用AssertJ自带的类型断言:
JsonPath jp = response.jsonPath(); Object moneyValue = jp.get("amount.money"); // 验证这个值确实是Long类型 Assertions.assertThat(moneyValue).isInstanceOf(Long.class); // 验证它绝对不是Double类型 Assertions.assertThat(moneyValue).isNotInstanceOf(Double.class);
这里的关键是不提前做类型转换——大多数JSON解析库会把JSON里的整数(比如123)映射为Long,浮点数(比如123.45)映射为Double,保留原始Object就能准确判断类型。
方法二:处理“伪装成整数的Double”
如果你的场景中可能出现JSON返回123.0(虽然是Double类型,但值是整数),而你需要排除这种情况,可以再加一层数值校验:
JsonPath jp = response.jsonPath(); Object moneyValue = jp.get("amount.money"); Assertions.assertThat(moneyValue) .satisfies(value -> { // 如果是Double类型,必须不是整数形式 if (value instanceof Double) { Assertions.assertThat((Double) value).isNotEqualTo(Math.floor((Double) value)); } }) // 同时确保是整数类型(Long或Integer) .isInstanceOfAny(Long.class, Integer.class);
为什么直接转long行不通?
当你写long money = jp.get("amount.money");时,JsonPath会自动做隐式转换:哪怕原始值是Double(比如123.0),它也会转成long给你。这时候你手里的变量已经是long类型了,根本没法追溯它原本是不是Double。所以一定要先拿原始对象!
内容的提问来源于stack exchange,提问作者The man
相关产品推荐
相关产品推荐

