You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 17:33:00