39637


AdministratorクラスのlistメソッドをJUnitを使ってテストしたいのですが、assertEqualsを使って結果を比べようとしても、型が違うと表示されてしまい上手くいきません。それと、リストの中身を全て比べたいのですが、それも良いアイデアがありません。どのように修正したらいいでしょうか？

[code]

    @Test
    public void listTest() {
        Object[] expectedEmps = new Object[];
        expectedEmps[0] = new Student("a", "a", "a", "a", "a", "uni");
        expectedEmps[1] = new Student("2", "1", "2", "1", "2", "uni2");
        Administrator.add("a", "a", "a", "a", "a", "uni", list);
        Administrator.add("2", "1", "2", "1", "2", "uni2", list);
        assertEquals(expectedEmps, Administrator.list(list));
    }
    
[/code]

Administratorクラスです

[code]

    public static ArrayList<Student> list = new ArrayList<Student>();
    public static ArrayList<Subject> listSub = new ArrayList<Subject>();
    
     public static void list(ArrayList<Student> list) {
        for(int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
            System.out.print("<Subject>: ");
            Administrator.listStr(Administrator.listCorrect(list.get(i).getID()));
            System.out.println("");
        }
    }
    public static ArrayList<String> listCorrect(String iden) {
        ArrayList<String> templist = new ArrayList<String>();
        for(int i = 0; i < Administrator.listSub.size(); i++) {
            if(iden.equals(listSub.get(i).getID())){
                    templist.add(listSub.get(i).getSub());
            }
        }
        return templist;
    }
    public static void add(String id, String password, String name, 
            String nationality,String address, String univeristy, ArrayList<Student> list) {
        list.add(new Student(id, password, name, nationality, address, univeristy));
    }
    
[/code]

Studentクラスです

[code]

    public Student(String id, String password, String name, String nationality,String address, String university){
        this.id = id;
        this.password = password;
        this.name = name;
        this.nationality = nationality;
        this.address = address;
        this.university = university;
    }
    public String getID() {
        return this.id;
    }
    
[/code]


CC BY-SA 3.0
2017-11-16T23:24:33.783
39635
2017-11-17T01:43:50.983
2017-11-17T01:01:37.577
19110
22984
question
java junit
JUnit の assertEquals で結果を比べようとしても型エラーになる

[code]

    assertEquals(expectedEmps, Administrator.list(list));
    
[/code]

`expectedEmps` は `Object[]` 型、`Administrator.list(list)` は
`ArrayList<Student>` 型を返すので、明らかに型が違います。`assertEquals` は同じ型の同値を比較するものなので、この場合は
`Object[]` 型同士または `ArrayList<Student>` 型同士を比較する必要があります。

JUnit でリストの中身を比較するのは確かにトリッキーです。もっとも単純なのは、リストをループで回して1つずつ比較する方法です。

[code]

    List<String> expected = ...
    List<String> actual = ...
    assertEquals(expected.size(), actual.size());
    for (int i = 0; i < actual.size(); i++) {
      assertEquals(expected.get(i), actual.get(i));
    }
    
[/code]

もしくは、より上級編としては、Hamcrest や AssertJ といったライブラリを使う方法があります。

Hamcrest の場合、`org.hamcrest.Matchers`
クラスに以下のような比較用のメソッドが揃っています。いずれにせよ、リストの中身を全比較というメソッドはないので、何らかの工夫は必要です。  
<http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html>

  * `arrayContaining(E... items)`
  * `contains(E... items)`
  * `containsInAnyOrder(T... items)`
  * `hasItems(E... items)`

例えば、こんな書き方ができるでしょう。

[code]

    assertThat(
        Administrator.list(list),
        containsInAnyOrder(
            new Student("a", "a", "a", "a", "a", "uni"),
            new Student("2", "1", "2", "1", "2", "uni2"))));
    
[/code]

（ただし、このコードは `Student` に `equals` メソッドが正しく実装されていることが前提です。）


CC BY-SA 3.0
2017-11-17T01:43:50.983
39637
2017-11-17T01:43:50.983
244
39635
answer