2016-09-07 2 views
0

이제 저는 Kent Beck의 "Test Driven Development"를 읽었으며 "개인 정보"장의 이해에 문제가 있습니다. JUnit 4를 사용하고 있으며 장의 코드가 있습니다.도서 코드가 작동해야합니까?

클래스 우리가 테스트됩니다

public class Dollar { 
    private int amount; 

    Dollar(int amount) { 
     this.amount = amount; 
    } 

    public Dollar times(int multiplier) { 
     return new Dollar(amount * multiplier); 
    } 

    public boolean equals(Dollar d) { 
     return amount == d.amount; 
    } 
} 

(전체 책에서 복사) 시험 :

public void testMultiplication() { 
    Dollar five= new Dollar(5); 
    assertEquals(new Dollar(10), five.times(2)); 
    assertEquals(new Dollar(15), five.times(3)); 
} 

내가이 테스트가 작동한다는 것을 이해하는 장을 읽기. 그러나 times 메서드는 항상 새 객체를 반환하므로 assertEquals은 항상 실패하므로 작동하지 않습니다.

내 질문은 :이 테스트가 작동합니까? 아니면 그냥 다른 프로그래밍 언어로 번역하는 예제로 제공됩니까?

+2

이러한 종류의 실수는 정확하게 ['@ Override'] (https://docs.oracle.com/javase/8/docs/api/java/lang/Override.html) 주석이 작성된 이유입니다. – Bohemian

답변

0

개체가 동일하거나 전혀 동일하지 않기 때문에이 점을 이해할 수 없다.

나는 책의 예제가 유용 할 거라고 생각하지만,이 책은 당신에게 정확한 개념을 제공하는 것과는 대조적으로 일반적인 개념을 제공하려고 생각했다.

0

assertEquals()에는 equals() 메서드를 호출 할 때 몇 가지 문제가있는 것으로 보입니다. 디버깅하는 동안 어떤 이유로 오버라이드 된 equals() 메소드를 호출하는 대신 junit 라이브러리가 리플렉션을 통해 정확한 클래스 정의를 찾아 메소드를 호출한다는 것을 알게되었습니다. 결국 결국 obj의 메모리 값을 비교하게됩니다. 그러나 다른 기여자가 지적한대로 Equals()는 잘 작동합니다.

0

Kevin Grant와 마찬가지로 작동해야합니다.

JUnit을 배우는 것처럼 보였기 때문에 클래스에 equals 메소드를 항상 덮어 씁니다. 그렇지 않으면 assertEquals()를 사용하여 참조 변수가 동일한 메모리 주소를 가리키는 지 여부 만 확인합니다. Eclipse를 사용하면 쉽게이 작업을 수행 할 수 있습니다 마우스 오른쪽 단추로 클릭 코드에서 아무 곳 -> 소스 -> 해시 코드()와 같음()를 ... 생성

1

출처 : Junit API

assertEquals의 소스 코드가

을 말한다
/** 
* Asserts that two objects are equal. If they are not 
* an AssertionFailedError is thrown with the given message. 
*/ 
static public void assertEquals(String message, Object expected, Object actual) { 
    if (expected == null && actual == null) { 
     return; 
    } 
    if (expected != null && expected.equals(actual)) { 
     return; 
    } 
    failNotEquals(message, expected, actual); 
} 

assertEquals를 호출하면 Dollar 클래스의 .equals을 호출합니다.

보헤미안 언급했듯이 equals 메서드의 @Override->Object 클래스는 우리의 맞춤 구현을 기반으로 확인할 수있는 능력을 제공합니다.

assertEquals(new Dollar(10), five.times(2)); 

.equals은 양을 계산하여 목적을 해결합니다.

+1

명확히하기 위해 필요한 구체적인 변경 사항은 'equals (Dollar)'뿐만 아니라 'equals (Object)'를 구현하는 것입니다. @ DevdattaK가 IDE에서'hashCode'와'equals'를 생성하는 제안은 그것을 올바르게하는 빠른 방법입니다. –

+0

고맙습니다. 문제 해결을 도와주세요! –

관련 문제