assertEquals
은 비교를 위해 equals
방법을 사용합니다. ==
연산자를 사용하는 다른 어설 션 인 assertSame
이 있습니다.
==
이 문자열과 함께 사용되어서는 안되는 이유를 이해하려면 ==
을 이해해야합니다. 신원 확인을 수행합니다. 즉, a == b
은 a
과 b
이 같은 개체을 참조하는지 확인합니다. 그것은 언어에 내장되어 있으며, 다른 클래스에 의해 그 동작을 변경할 수 없습니다. 반면에 equals
메서드는 클래스에 의해 재정의 될 수 있습니다. 기본 동작 (Object
클래스)은 ==
연산자를 사용하여 신원 확인을 수행하는 반면 String
을 비롯한 많은 클래스는이를 대체하여 "동등성"검사를 대신합니다. String
의 경우 과 b
이 동일한 개체를 참조하는지 확인하는 대신 a.equals(b)
은 참조하는 개체가 모두 정확히 동일한 문자를 포함하는 문자열인지 확인합니다.
유추 시간 : 각 String
개체는 그 위에 무엇인가가 쓰여진 종이라는 것을 상상해보십시오. 두 개의 종이에 "Foo"라고 적혀 있고, 다른 하나는 "Bar"로 쓰여져 있다고 가정 해 봅시다. 첫 번째 두 장을 받아 ==
을 사용하여 비교하면 false
이 반환됩니다. 왜냐하면 본질적으로 "이것들은 같은 종이입니까?"라고 묻기 때문입니다. 그것은 종이에 쓰여진 것을 보지 않아도됩니다. 두 개의 종이가 아닌 두 장의 종이를주고 있다는 사실은 false
을 반환한다는 것을 의미합니다. 그러나 equals
을 사용하는 경우 equals
메서드는 두 개의 종이를 읽고 동일한 내용 ("Foo")을 사용하므로 true
을 반환합니다.
Strings와 혼동스럽게되는 비트는 Java가 "interning"Strings 개념을 갖고 있으며 이는 코드의 문자열 리터럴에서 자동으로 수행된다는 것입니다. 즉, 코드에 두 개의 동일한 문자열 리터럴이있는 경우 (서로 다른 클래스에 있어도) 실제로는 모두 동일한 String
객체를 참조하게됩니다. 이렇게하면 ==
연산자가 true
번보다 더 자주 반환 될 수 있습니다.
확실하지 않은 경우 코드 또는 Javadoc을 읽을 수 있습니다. BTW 만약 당신이 assertSame 사용할 수있는 동일한 개체를 테스트하고 싶습니다. –
str1 및 str2가 null 인 경우 assertEquals()가 true이지만 assertTrue (str1.equals (str2))가 예외를 throw합니다. 첫 번째 예제는 str1과 str2의 내용과 같은 유용한 오류 메시지도 출력합니다. 두 번째 예제는 유용하지 않습니다. –