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

如何以声明式方式断言/验证Kotlin数据类结构?

Kotlin声明式断言匹配库推荐

针对你需要的声明式定义预期结果、支持忽略任意字段的测试场景,以下几个库可以满足需求,完全适配你给出的示例写法:

1. Kotest Assertions(最贴合需求)

Kotest的断言系统原生支持递归匹配和任意值占位,写法和你预期的几乎完全一致:

import io.kotest.matchers.shouldBeRecursivelyEqualTo
import io.kotest.matchers.any

val actual = // 你的实际返回结果
actual shouldBeRecursivelyEqualTo RootClass(
    a = "Foo",
    nestedContent = MiddleClass(
        foo = any(),
        leaf = Leaf(
            value = "leaf-value",
            leaf = any()
        )
    )
)

any()会自动匹配对应类型的任意值,shouldBeRecursivelyEqualTo会递归校验所有明确指定的字段,忽略用any()标记的字段,完全符合你要的声明式易读性,非常适合示例驱动规范场景。

2. AssertJ Kotlin(生态兼容)

如果你已经在使用AssertJ生态,它的递归比较功能结合any()匹配器也能实现需求:

import org.assertj.core.api.Assertions.assertThat
import org.assertj.core.api.Assertions.any

val expected = RootClass(
    a = "Foo",
    nestedContent = MiddleClass(
        foo = any(String::class.java),
        leaf = Leaf(
            value = "leaf-value",
            leaf = any(Leaf::class.java)
        )
    )
)

val actual = // 你的实际返回结果
assertThat(actual).usingRecursiveComparison()
    .isEqualTo(expected)

usingRecursiveComparison()会识别any()标记的字段,跳过精确匹配,只校验指定的字段值。

3. MockK(Mock场景适配)

如果你的测试同时涉及Mock,MockK的匹配器可以结合断言使用,写法稍显繁琐但生态统一:

import io.mockk.assertThat
import io.mockk.matchers.any

val expected = RootClass(
    a = "Foo",
    nestedContent = MiddleClass(
        foo = any(),
        leaf = Leaf(
            value = "leaf-value",
            leaf = any()
        )
    )
)

assertThat(actual, match { it == expected })

最优方案选择

如果追求最贴近示例写法、易读性最高,优先选Kotest Assertions;如果已经在用AssertJ,AssertJ Kotlin的递归比较是无缝适配的方案。

内容的提问来源于stack exchange,提问作者Touko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:32:50