Java: является ли assertEquals(String, String) надежным?
Я знаю, что == есть некоторые проблемы при сравнении двух Strings. Кажется, что String.equals() лучший подход. Ну, я делаю тестирования JUnit и я склоняюсь к тому, чтобы использовать assertEquals(str1, str2). Это надежный способ утверждать, что две строки содержат одно и то же содержимое? Я бы использовал assertTrue(str1.equals(str2)), но тогда вы не получите преимущество видя, что ожидаемые и фактические значения на провал.
в соответствующей заметке у кого-нибудь есть ссылка на страницу или поток, который ясно объясняет проблемы с str1 == str2?
7 ответов:
вы должны всегда использовать
.equals()сравнениеStringsв Java.JUnit вызывает
.equals()метод определения равенства в методеassertEquals(Object o1, Object o2).Итак, вы определенно безопасны с помощью
assertEquals(string1, string2). (Потому чтоStringСObjects)вот ссылка на большой вопрос Stackoverflow относительно некоторых различий между
==и.equals().
assertEqualsиспользуетequalsметод сравнения. Есть другое утверждение,assertSame, который использует==оператора.чтобы понять, почему
==не следует использовать со строками, которые вам нужно понять, что==делает: он делает проверку личности. То есть,a == bпроверяет, еслиaиbотносятся к тот же объект. Он встроен в язык, и его поведение не может быть изменено различными классами. Элементequalsметод, на с другой стороны, может быть переопределен классами. В то время как его поведение по умолчанию (вObjectкласс), чтобы сделать проверку личности с помощью==оператора, многие классы, в том числеString, переопределите его, чтобы вместо этого сделать проверку "эквивалентности". В случаеString, вместо того, чтобы проверить, еслиaиbобратитесь к тому же объекту,a.equals(b)проверяет, являются ли объекты, на которые они ссылаются, обеими строками, содержащими точно такие же символы.аналогия времени: представьте, что каждый
Stringобъект-это лист бумаги с чем-то написанным на нем. Допустим, у меня есть два листа бумаги с надписью "Foo" и еще один с надписью "Bar". Если я возьму первые два листа бумаги и использую==чтобы сравнить их он вернетсяfalseпотому что это, по сути, вопрос: "это один и тот же листок бумаги?". Ему даже не нужно смотреть на то, что написано на бумаге. Тот факт, что я даю ему два листа бумаги (а не один и тот же дважды) означает, что он будет возвратитьfalse. Если я использую , вequalsметод прочитает два листа бумаги и увидит, что они говорят одно и то же ("Foo"), и поэтому он вернетtrue.бит, который путается со строками, заключается в том, что Java имеет концепцию "интернирования" строк, и это (эффективно) автоматически выполняется на любых строковых литералах в вашем коде. Это означает, что если у вас есть два эквивалентных строковых литерала в коде (даже если они находятся в разных классах), они будут на самом деле оба относятся к одному и тому же
в двух словах - вы можете иметь два строковых объекта, которые содержат одни и те же символы, но являются разными объектами (в разных местах памяти). Оператор == проверяет, что две ссылки указывают на один и тот же объект (ячейку памяти), но метод equals() проверяет, совпадают ли символы.
обычно вы заинтересованы в проверке, если две строки содержат одни и те же символы, а не указывают ли они на одну и ту же ячейку памяти.
Да, он используется все время для тестирования. Очень вероятно, что используется платформа тестирования .equals () для таких сравнений.
Ниже приведена ссылка, объясняющая "ошибку равенства строк". По сути, строки в 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); } }
От JUnit
assertEquals(obj1, obj2)действительно ли позвонитьobj1.equals(obj2).там же
assertSame(obj1, obj2)что значитobj1 == obj2(т. е. проверяет, чтоobj1иobj2запускаем то же самое экземпляр), который является то, что вы пытаетесь избежать.так что ты в порядке.
" The
==оператор проверяет, если дваObjectsточно так жеObject."http://leepoint.net/notes-java/data/strings/12stringcomparison.html
String- этоObjectв java, поэтому он попадает в эту категорию правил сравнения.