0

前提条件:我正在将复杂的 JSON 反序列化为数据类。目标类有一些复杂的层次结构。

我有一个对象列表。其中 ServiceFeature 如下(它在 kotlin 中,但没关系):

data class ServiceFeature(
    val flagValue: String?,
    val effectiveFlagValue: String?,
    val name: String?,
    val attributes: List<Attribute?>?
)

如您所见ServiceFeature,有一个“属性”属性,其中包括另一个“属性”列表。要点是列表中的属性可能是任何顺序。有没有一种可靠的方法来比较两个ServiceFeatures没有订单检查的列表List<Attribute?>

我正在尝试使用 assertJ 找到解决方案。

4

2 回答 2

2

如果元素的顺序无关紧要,那么您可以使用Set代替List. 话虽如此,您可以使用AssertJ 提供的containsExactlyInAnyOrder()方法。此方法需要 var-args 作为参数,因此为了将列表转换为数组,我们可以使用toTypedArray扩展运算符Eg


import org.junit.Test
import org.assertj.core.api.Assertions.*

data class ServiceFeature(
        val flagValue: String?,
        val effectiveFlagValue: String?,
        val name: String?,
        val attributes: List?
)

data class Attribute(val name: String?)

class SimpleTest {
    @Test
    fun test() {
        val list1 = listOf(ServiceFeature("flagA", "effectiveFlagA", "foo", listOf(Attribute("a"), Attribute("b"))))
        val list2 = listOf(ServiceFeature("flagA", "effectiveFlagA", "foo", listOf(Attribute("b"), Attribute("a"))))
        list1.zip(list2).forEach {
            assertThat(it.first.name).isEqualTo(it.second.name)
            assertThat(it.first.effectiveFlagValue).isEqualTo(it.second.effectiveFlagValue)
            assertThat(it.first.name).isEqualTo(it.second.name)
            val toTypedArray = it.second.attributes!!.toTypedArray() // null-check as per your need
            assertThat(it.first.attributes).containsExactlyInAnyOrder(*toTypedArray)
        }

    }
}
于 2017-11-07T15:01:12.690 回答
2

如果顺序对您的属性无关紧要并且它们是唯一的(即可能没有相同类型的多个属性),您可以将结构更改为 aSet<Attribute?>而只是使用常规比较。

如果您想保留顺序但比较(唯一)属性,您可以在比较时将它们转换为 set,请参阅在 Java 中将 List 转换为 Set 的最简单方法

于 2017-11-07T14:49:01.490 回答