2017-11-07 14 views
0

전제 조건 : 복잡한 json을 데이터 클래스로 직렬화 해제하고 있습니다. 대상 클래스는 약간 복잡한 계층 구조를가집니다.List 프로퍼티에서 순서 체크가없는 오브젝트 목록을 확인하십시오.

개체 목록이 있습니다. 목록. ServiceFeature 다음 인 경우 (이 코 틀린에, 그러나 중요하지 않습니다) :

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

당신이 ServiceFeature은 "속성"의 또 다른 목록을 포함하는 "속성"속성이 볼 수 있듯이. 요점은 목록에있는 속성이 어떤 순서로도 될 수 있다는 것입니다. 목록에서 주문 확인없이 ServiceFeatures의 두 목록을 비교하는 신뢰할 수있는 방법이 있습니까

assertJ를 사용하여 솔루션을 찾으려고합니다.

미리 감사드립니다.

답변

1

주문에 대한 속성이 중요하지 않고 고유 (즉, 동일한 유형의 속성이 여러 개 없을 수 있음) 인 경우 구조를 Set<Attribute?>으로 변경하고 일반 비교를 사용할 수 있습니다.

주문을 보존하고 비교하는 (고유 한) 특성을 비교하려면 비교할 때 변환하도록 변환 할 수 있습니다 (Easiest way to convert a List to a Set in Java 참조).

+0

감사, 데이터 클래스에 설정하는 변경 목록 은'발 속성 마법처럼 작동? -> val 속성 : 집합 ? – Mike

2

요소의 순서가 중요하지 않은 경우 List 대신 Set을 사용할 수 있습니다. 그렇다면 AssertJ에서 제공하는 containsExactlyInAnyOrder() 메서드를 사용할 수 있습니다. 이 메소드는 var-args를 인수로 사용하기 때문에 목록을 배열로 변환하기 위해 과 spread operator 등을 사용할 수 있습니다. 목록 :


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) 
     } 

    } 
} 
+0

고마워, 나는이 방법을 시도했다. 그것은 배열과 함께 작동하지만 제 경우에는 하나의 배열을 속성으로 갖는 객체 배열이 있습니다. 내 경우에는 어설 션이 ServiceFeature – Mike

+0

에 대한 목록 확인에 실패했습니다. 목록을 비교하고 업데이트 된 답변을 볼 수있는 방법을 조정할 수 있습니다 – sol4me