Java의 AsserTequals 방법은 신뢰할 수 있습니까?
문제
나는 그것을 알고있다 ==
두 가지를 비교할 때 몇 가지 문제가 있습니다 Strings
. 그것은 것 같습니다 String.equals()
더 나은 접근 방식입니다. 글쎄, 나는 주니트 테스트를하고 있고 내 성향은 사용하는 것입니다 assertEquals(str1, str2)
. 두 줄에 같은 내용이 포함되어 있다고 주장하는 신뢰할 수있는 방법입니까? 나는 사용할 것이다 assertTrue(str1.equals(str2))
, 그러나 예상 및 실제 값이 실패한 것을 보는 이점을 얻지 못합니다.
관련 메모에서 누구나 문제를 분명히 설명하는 페이지 나 스레드에 대한 링크가 있습니까? str1 == str2
?
해결책
당신은해야합니다 언제나 사용 .equals()
비교할 때 Strings
자바에서.
주니트는 .equals()
방법에서 평등을 결정하는 방법 assertEquals(Object o1, Object o2)
.
따라서, 당신은 확실히 안전합니다 assertEquals(string1, string2)
. (왜냐하면 String
s는 Object
에스)
다음은 훌륭한 stackoverflow 질문에 대한 링크입니다 간의 차이점에 대해 ==
그리고 .equals()
.
다른 팁
assertEquals
사용 equals
비교 방법. 다른 주장이 있습니다. assertSame
, ==
운영자.
이유를 이해합니다 ==
무엇을 이해하는 데 필요한 줄과 함께 사용해서는 안됩니다. ==
그렇게 : 신원 확인을합니다. 그건, a == b
확인하는지 확인합니다 a
그리고 b
참조 같은 객체. 언어에 내장되어 있으며 다른 클래스로는 행동을 바꿀 수 없습니다. 그만큼 equals
반면에 방법은 클래스에 의해 상환 될 수 있습니다. 기본 동작 ( Object
클래스)는 ==
운영자, 많은 수업을 포함합니다 String
, 대신 "동등성"점검을 수행하도록 재정의하십시오. 의 경우 String
, 확인하는 대신 a
그리고 b
동일한 개체를 참조하고 a.equals(b)
그들이 참조하는 객체가 정확히 같은 문자를 포함하는 문자열인지 확인합니다.
비유 시간 : 각각을 상상해보십시오 String
객체는 그 위에 쓰여진 용지입니다. "foo"가 작성된 두 장의 종이가 있고 다른 하나는 "바"가 쓰여졌다 고 가정 해 봅시다. 처음 두 종이를 가져 와서 사용한다면 ==
그것들을 비교하기 위해 돌아올 것입니다 false
그것은 본질적으로 "이것들이 같은 종이입니까?"라고 묻기 때문입니다. 종이에 쓰여진 내용을 볼 필요조차 없습니다. 내가 두 개의 종이를 두 번주고 있다는 사실은 그것이 두 번 같은 종이가 아니라 반환한다는 것을 의미합니다. false
. 내가 사용하는 경우 equals
, 그러나, 그 equals
방법은 두 장의 종이를 읽고 같은 말을하는 것을 볼 수 있습니다 ( "foo"). true
.
문자열과 혼동하는 비트는 Java가 "Interning"문자열이라는 개념을 가지고 있으며, 이는 코드의 모든 문자열 리터럴에서 자동으로 수행된다는 것입니다. 이것은 코드에 동등한 문자 그럴이 두 개가 있다면 (다른 클래스에 있더라도) 실제로 동일하게 참조합니다. String
물체. 이것은로 만듭니다 ==
운영자 반환 true
한 사람보다 더 자주 기대할 수 있습니다.
간단히 말해서 - 동일한 문자를 포함하지만 다른 객체 (다른 메모리 위치) 인 두 개의 문자열 객체를 가질 수 있습니다. == 운영자는 두 참조가 동일한 객체 (메모리 위치)를 가리키는 것을 확인하지만, equals () 메소드는 문자가 동일한지 확인합니다.
일반적으로 두 문자열에 동일한 메모리 위치를 가리키는지 여부가 아닌 동일한 문자가 포함되어 있는지 확인하는 데 관심이 있습니다.
예, 테스트에 항상 사용됩니다. 테스트 프레임 워크가 이와 같은 비교에 .quals ()를 사용했을 가능성이 높습니다.
아래는 "문자열 평등 실수"를 설명하는 링크입니다. 기본적으로 Java의 문자열은 물체이며, 객체 평등을 비교할 때 일반적으로 내용이 아닌 메모리 주소를 기준으로 비교됩니다. 이로 인해 콘텐츠가 동일하더라도 두 개의 문자열이 동일한 주소를 차지하지 않으므로 인쇄 할 때 동일하게 보이지만 올바르게 일치하지 않습니다.
http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/
public class StringEqualityTest extends TestCase {
public void testEquality() throws Exception {
String a = "abcde";
String b = new String(a);
assertTrue(a.equals(b));
assertFalse(a == b);
assertEquals(a, b);
}
}
주니 assertEquals(obj1, obj2)
실제로 전화를합니다 obj1.equals(obj2)
.
또한 있습니다 assertSame(obj1, obj2)
그렇습니다 obj1 == obj2
(즉, 그것을 확인합니다 obj1
그리고 obj2
참조하고 있습니다 같은 인스턴스), 당신이 피하려는 것입니다.
그래서 당신은 괜찮습니다.
"그만큼
==
운영자는 두 개를 확인합니다Objects
정확히 동일합니다Object
."
http://leftoint.net/notes-java/data/strings/12stringcomparison.html
String
이다 Object
Java에서는 해당 범주의 비교 규칙에 속합니다.