JUnit中如何比较对象与数组?JWT aud断言类型转换异常解决
解决JWT受众(aud)的JUnit断言类型转换异常问题
问题场景
你的代码中,tokenPayload.get("aud")返回的Object本质是ArrayList<String>(对应JWT的aud数组声明):
private final Map<String, Object> tokenPayload = // 假设已填充数据 tokenPayload.get("aud") // 返回Object类型,实际是ArrayList<String>
对应的JWTaud结构:
{ "aud": [ "https://www.example.com" ] }
你尝试用以下断言时触发类型转换异常:
assertArrayEquals(new String[] {"https://www.example.com"}, (Object[])tokenPayload.get("aud"));
错误信息:
ClassCast class java.util.ArrayList cannot be cast to class [Ljava.lang.String; (java.util.ArrayList and [Ljava.lang.String; are in module java.base of loader 'bootstrap')
正确的测试方法
方法1:转成List后生成数组断言
先将aud强制转为List<String>,再通过toArray()生成字符串数组进行比对:
List<String> audienceList = (List<String>) tokenPayload.get("aud"); assertArrayEquals(new String[] {"https://www.example.com"}, audienceList.toArray(new String[0]));
方法2:直接比对集合(更简洁)
如果你的JUnit版本支持(Java 9+),可以直接用List.of()生成预期集合,通过assertEquals比对:
assertEquals(List.of("https://www.example.com"), tokenPayload.get("aud"));
如果是Java 8及以下,用Arrays.asList()替代:
assertEquals(Arrays.asList("https://www.example.com"), tokenPayload.get("aud"));
原因说明
JWT解析库通常会将JSON数组解析为java.util.ArrayList实例,而非原生数组。直接将ArrayList强转为Object[]或String[]会触发类型转换异常,因为两者属于不同的类型体系。
内容的提问来源于stack exchange,提问作者Robert O'Neal
相关产品推荐
相关产品推荐

