Viele APIs in Android beschÀftigen sich mit CharSequence
. Und die Verwendung von assertEquals()
mit CharSequence
Argumenten ist umstÀndlich und instabil. Man muss genau den gleichen Typ reproduzieren, der sich spÀter Àndern kann.
Und manchmal funktioniert es einfach nicht (zB StringBuilder
verwendet die Standardimplementierung von Object.equals()
).
Daher wĂŒrde ich vorschlagen, neue Methoden hinzuzufĂŒgen wie
assertContentEquals(CharSequence expected, CharSequence actual)
das wĂŒrde nur den Inhalt vergleichen, unabhĂ€ngig von der Art, in die er verpackt wurde.
(Pull Request #949 hat versucht, dies mit generischen assertEquals()
zu tun, was in der Tat fragwĂŒrdig ist)
Ich kann eine Pull-Anfrage erstellen, wenn Sie diesen Vorschlag fĂŒr angemessen halten.
Wichtiges Thema, aber ich wĂŒrde es vorziehen, es in assertEquals
oder einer Ăberladung von assertEquals
zu tun. Zu wissen, welche Assert-Nachricht fĂŒr welchen Anwendungsfall verwendet werden soll, ist fehleranfĂ€llig.
Sie sollten erwĂ€gen, Assertion-Frameworks mit einer flĂŒssigen API (wie Truth oder Fest) zu verwenden.
Das Problem bei assertEquals
ist, dass Sie manchmal auch die Typen vergleichen mĂŒssen.
Also glaube ich, dass assertEquals("abc", new StringBuilder("abc"))
fehlschlagen muss. Daher sind separate Methoden erforderlich, um nur den Inhalt zu vergleichen.
Dies ist IMO dem aktuellen assertArrayEquals
Ansatz sehr Àhnlich.
Ich stimme zu, dass die Auswahl der richtigen Methode etwas schwieriger werden wĂŒrde. Aber es ist auf jeden Fall besser als der derzeitige Mangel an richtiger CharSequence
UnterstĂŒtzung.
Könnten Sie auflisten, welche spezifischen Methoden Sie vorschlagen?
Bisher habe ich nur an diese beiden gedacht:
Assert.assertContentEquals(CharSequence expected, CharSequence actual)
Assert.assertContentEquals(String message, CharSequence expected, CharSequence actual)
Können Sie bessere Beispiele nennen? Ich wĂŒrde niemals assertEquals("abc", new StringBuilder("abc"))
schreiben (ich wĂŒrde build()
fĂŒr den Builder aufrufen)
AuĂerdem denke ich, dass DSL-basierte Frameworks oft besser passen. In Wahrheit wĂŒrde ich schreiben:
assertThat(myCharSequence).hasValue("hello");
Beachten Sie, dass hasValue()
ein String
also steht auĂer Frage, was es bedeutet, wenn zwei CharSequence
Werte als gleich angesehen werden.
Hier ist ein Beispiel, wie es in einem Test aussehen könnte:
assertContentEquals("abc", bundle.getCharSequence(Notification.EXTRA_TEXT));
Es ist eine gute Idee, auch ein HasValue
Matcher
hinzuzufĂŒgen.
Danke. Da CharSequence
keinen Vertrag fĂŒr equals()
bereitstellt, wie schlagen Sie vor, dass wir zwei CharSequence
Werte als gleich betrachten? Ist es einfach, dass sie dieselbe ReprÀsentation von toString()
? Wenn ja, warum machen Sie nicht den erwarteten Wert zu String
?
Guter Punkt. Obwohl ich zögere, weil erwartete und tatsÀchliche Werte mit demselben Typ sauberer aussehen.
Und ich wĂŒrde auch zuerst die LĂ€ngen vergleichen. Um zu vermeiden, dass toString()
aufgerufen wird, es sei denn, es ist wirklich notwendig.
Ich möchte diese Funktionsanfrage bitte annehmen. Könnte es mir bitte zugeteilt werden. Danke schön.
@joseph-mccarthy GitHub lĂ€sst Sie anscheinend nur jemandem im Projektteam Probleme zuweisen. Aber wir vergeben sowieso fast nie Themen. FĂŒhlen Sie sich frei, einen Pull-Request zu senden, nachdem Sie https://github.com/junit-team/junit4/blob/master/CONTRIBUTING.md gelesen haben
@kcooney Ich habe eine Frage zu diesem Problem, ist es noch zu gewinnen?
Ich sehe, dass es in PR #1439 verlinkt ist, aber dass PR seit lĂ€ngerer Zeit eine Ănderung beantragt. Kann ich das als Grundlage fĂŒr eine neue PR nehmen und die Rezensionskommentare durchgehen?
@joseph-mccarthy arbeitest du noch daran?
@kcooney Ich
Hilfreichster Kommentar
@joseph-mccarthy GitHub lĂ€sst Sie anscheinend nur jemandem im Projektteam Probleme zuweisen. Aber wir vergeben sowieso fast nie Themen. FĂŒhlen Sie sich frei, einen Pull-Request zu senden, nachdem Sie https://github.com/junit-team/junit4/blob/master/CONTRIBUTING.md gelesen haben