2016-04-01 3 views
2

私は可能な限り明確にしようとしています。編集を躊躇しないでください。オブジェクトのコレクションからのコレクション属性のテストコンテンツ

私の問題は、私は、この構造体の内容をテストし、Bオブジェクトのよりspecialyな内容と、それは特定のA値に対応することを保証したいということです。

public class A { 
    String key; 
    List<B> bs; 
} 

そして、私のデータは、このフォームを持っている

List<A> as = [ 
    { 
     key : "KEY1", 
     bs: [ 
      {val1:"val1", val2:"val2} 
     ] 
    }, 
    { 
     key : "KEY2", 
     bs: [ 
      {val1:"val3", val2:"val4"}, 
      {val1:"val5", val2:"val6"} 
     ] 
    }, 
]; 

ユニットテストのコンテキストでは、私はこの構造をテストして、Bのリストを取得することなく、この構造をテストできるようにしたいと考えています。この構造をテストすることで、 KEY2の2つのBと、最初のBのval3とval4、第2のval5およびval6。

現時点では、キーでマップを作成してすべてのエントリをテストする必要があります。私はそれがあればもっと簡単な方法でそれを望みます。

ここは私の実際のテストです。

List<A> as = captor.getAllValues(); 
assertThat(as) 
      .isNotNull() 
      .hasSize(2) 
      .extracting("key") 
      .containsOnlyOnce(
        tuple("KEY1"), 
        tuple("KEY2") 
      ); 

    Map<String, A> estimationParPlateforme = indexBy(as, new Indexer<String, A>() { 
     @Override 
     public String apply(A a) { 
      return a.getKey(); 
     } 
    }); 

assertThat(as.get("KEY1").getBs()) 
      .isNotEmpty() 
      .extracting(
        "val1", 
        "val2" 
      ) 
      .containsExactly(
        tuple(
          "val1", 
          "val2" 
        ) 
      ); 

assertThat(as.get("KEY2").getBs()) 
      .isNotEmpty() 
      .extracting(
        "val1", 
        "val2" 
      ) 
      .containsExactly(
        tuple(
          "val3", 
          "val4" 
        ), 
        tuple(
          "val5", 
          "val6" 
        ) 
      ); 

これはテストに少し時間がかかると思いますが、これを改善する方法を探しています。何か解決策はありますか?

ありがとうございました

+0

'assertThat(as).extraction(" bs ")' etc? –

答えて

1

データ構造をどのように見えるかを定義する必要があります。現時点では、すべての情報がテストステートメントに散在しています。それはあなたがすでに考えているように、それを非常に醜いものにします。私がやりたいことは、私が期待しているデータで満たすことができる、いくつかのデータ構造を持つことです。それから私は、私のデータが有効かどうかをテストするためにこれを使うことができます。例:

static Map<String, B[]> expectedBs = new HashMap<String, B[]>(); 

public static void main(String[] args) { 
    //put the expected values into a map 
    expectedBs.put("KEY1", new B[] { new B("val1", "val2") }); 
    expectedBs.put("KEY2", new B[] { new B("val3", "val4"), new B("val5", "val6") }); 

    //build a valid datastructure 
    List<A> as = new ArrayList<A>(); 
    List<B> bs1 = new ArrayList<B>(); 
    bs1.add(new B("val1", "val2")); 

    List<B> bs2 = new ArrayList<B>(); 
    bs2.add(new B("val3", "val4")); 
    bs2.add(new B("val5", "val6")); 

    as.add(new A("KEY1", bs1)); 
    as.add(new A("KEY2", bs2)); 


    //test validity of as 
    System.out.println(isValid(as)); //prints true 

    //modify the datastructure such that it is not valid anymore 
    bs1.get(0).val1 = "val2"; 

    //test validity once more 
    System.out.println(isValid(as)); //prints false 
} 

static boolean isValid(List<A> as) { 
    for (A a : as) { 
     B[] expected = expectedBs.get(a.key); 
     if (!equals(a.bs, expected)) 
      return false; 
    } 
    return true; 
} 

static boolean equals(List<B> x, B[] y) { 
    if (x == null) 
     return false; 
    if (y == null) 
     return false; 
    if (x.size() != y.length) 
     return false; 
    for (int i = 0; i < x.size(); i++) 
     if (!x.get(i).equals(y[i])) 
      return false; 
    return true; 
} 

A:

public class A { 
    String key; 
    List<B> bs; 

    public A(String key, List<B> bs) { 
     this.key = key; 
     this.bs = bs; 
    } 
} 

B:限りbeeingてコード申し訳ありません

public class B { 
    String val1, val2; 
    public B(String val1, String val2) { 
     this.val1 = val1; 
     this.val2 = val2; 
    } 
    @Override 
    public boolean equals(Object obj) { 
     if (obj == null) 
      return false; 
     if (!(obj instanceof B)) 
      return false; 
     B objB = (B) obj; 
     if (!objB.val1.equals(this.val1)) 
      return false; 
     if (!objB.val2.equals(this.val2)) 
      return false; 
     return true; 
    } 
} 

。あなたはアイデアを得ることを願っています。これがよりエレガントであるかどうかは、あなたが決定するまでです。

+0

お返事ありがとうございます。あなたのソリューションは本当に面白いです。私はそれを念頭に置いている。私は実際にそれを行うためのより "Mockito"の方法を探しています。再びありがとう – RPresle

+0

@RPresleああ、私は、そのユニットテストについては、Mockitoを参照してください。あなたはどこかであなたの質問にそれを置くべきです。 –

+0

完了。ありがとうございます – RPresle

関連する問題