0
Public class Person {
    private Skill[] skills;

    public Skill[] getSkills() {
        return skills;
    }

    public void setSkills(Skill[] s) {
        if (s!= null) {
            skills = new Skill[s.length];

            for (int i = 0; i < s.length; i++) {
                skills[i] = s[i];
            }
        }
    }
}
}

class があるとしskillます。問題は、メソッド setSkill ugiving s = スキル配列自体をテストするテスト ケースが Junit にあることです。このテスト ケースは、両方の配列に同じ参照を与えるように を変更すると、テスト ケースがパスすることを示しAssertion errorています。The returned skill array should be the samegetSkill

誰でもそれを手伝ってもらえますか?参照ではなく要素をコピーするにはどうすればよいですか? テストケースが失敗するのはなぜですか?

テストケースは次のとおりです。

@Test(timeout = 1000) 
public void testGetSkills() { 
    instance.setSkills(skills); 
    assertSame("The returned skill array should be the same", instance.getSkills(), skills); 
}
4

2 に答える 2

1

あなたのテストケースは を使用していると述べていますassertSame。これは参照の等価性を探し、それが必要ですa == b

コードによってコピーが作成されます。コピーは、元の参照と同等になることはありません。Objectメソッドをオーバーライドする一部のクラスでEqualsは、trueassertEqualsが渡される場合があります。配列の場合は を使ってみてくださいassertArrayEquals

たとえば、次のテストに合格する必要があります。

@Test
public void assertArrayEqualsTest() throws Exception {
  assertArrayEquals(new int[]{1, 2, 3}, new int[]{1, 2, 3});
}

しかし、このテストは失敗します:

@Test
public void assertSameTest() throws Exception {
  assertSame(new int[]{1, 2, 3}, new int[]{1, 2, 3});
}

これがなぜなのかを明確にする必要があります。

于 2013-03-08T13:03:49.367 に答える
0

要素をコピーするのではなく、同じ要素を指す別の配列を作成するだけです。したがって、後でテスト ケースでアレイ スキルを変更する場合は、元のアレイ s も変更します。これがアサーションが失敗する原因だと思います。

于 2013-03-08T12:49:14.597 に答える