2013-03-08 6 views
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]; 
      } 
     } 
    } 
} 
} 

클래스 skill이 있다고 가정합니다. 문제는 setSkill 메서드를 테스트하는 Junit의 테스트 케이스가 있다는 것입니다. 이 테스트 케이스는 getSkill을 변경하면 테스트 케이스가 통과하는 두 개의 동일한 참조를 제공한다는 것을 알면서 을 알리는 Assertion error을 반환합니다.배열에 대한 어설 션 오류

아무도 도와 줄 수 있습니까? 참조가 아닌 요소는 어떻게 복사합니까? 왜 테스트 케이스가 실패합니까?

테스트 케이스는 다음과 같습니다 당신은 요소를 복사하지 않습니다

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

코드를 더 형식화하고 테스트를 게시 할 수 있습니까? – vikingsteve

+2

오류에 대해서는 잘 모르겠지만 전체 배열을 반복하지 않고 스킬을 설정하는 것이 어떻습니까? – ddmps

+3

@Pescis 명시 적으로 사본이 필요한 경우'System.arrayCopy()'를 사용하십시오. – berry120

답변

1

테스트 사례에 assertSame이 사용되었다고 언급했습니다. 이는 참조 평등을 찾으며 a == b이 필요합니다.

코드가 사본을 만듭니다. 복사본은 원본과 참조 평등을 가질 수 없습니다. 어떤 클래스에서는 Object 메서드를 오버라이드합니다. EqualsassertEquals이 통과 할 수도 있습니다. 배열의 경우 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}); 
} 

당신이 인 이유에 명확해야한다.

+0

감사합니다. 정말 감사합니다. 내가 그 주장에 대한 견해를 알지 못 했으므로 그것에 문제가있었습니다. . 다시 한 번 감사드립니다 :) –

+0

기꺼이 도와 드리겠습니다 :) 문서에는 어설 션의 모든 사용 가능한 유형 목록이 있습니다. http://junit.sourceforge.net/javadoc/org/junit/Assert.html –

0

, 당신은 단순히 같은 요소를 가리키는 또 다른 배열을 만들 수 있습니다. 따라서 나중에 테스트 케이스가 배열 기술을 수정하면 원래 배열을 수정하게됩니다. 나는 이것이 어설 션이 실패하게 만드는 원인이라고 생각한다.

+0

나는 같은 참조를주고 싶지 않아. 나중에 배열이 변경되어 스킬도 바뀔 수 있기 때문에 발생하지 않으려 고합니다. JUnit 테스트 케이스는 다음과 같습니다. @Test (timeout = 1000) \t public void testGetSkills() { \t \t 인스턴스 .setSkills (기술); \t \t assertSame ("반환 된 스킬 배열은 같아야합니다.", instance.getSkills(), skills); \t} –

+0

당신은하고 싶지 않습니다.하지만 당신이하는 일입니다. 또한 어쩌면 당신은 동일성 대신 평등을 주장해야합니다. –

+0

예. 감사합니다. –