Ich arbeite an diesem kleinen Java-Übungsprojekt, wo ich eine Art Dating-App programmieren soll ... Wir haben diese Online-Unit-Tests, um unsere Arbeit zu überprüfen, und ich möchte immer jede Methode und Klasse, die ich schreibe, testen, bevor ich weiterkomme. In einer der ersten Klassen bestehen einige Methoden nicht die Tests, und ich kann nicht herausfinden, warum ich viele verschiedene Dinge ausprobiert habe. Die erste Methode heißt getTitle und ist nur eine normale Getter-Methode, die mir den Wert zurückbekommt, der dem Titel im Konstruktor zugewiesen wurde (siehe Code unten). Die zweite Methode, die nicht übergeben wird, ist die .equals-Methode, die ich überschreiben musste. Ich werde die Fehler, die ich unten bekomme, nach den entsprechenden Codes posten. HierJava - Konstruktor, der null statt String dem erforderlichen Wert zuweist
ist der Konstruktor für diese Klasse:
public class Interest {
private String title;
private Map<String, Float> alternatives;
public Interest(String title, Map<String, Float> alternatives)
{
if (title.isEmpty()) //Title must contain something.
throw new IllegalArgumentException();
if (alternatives == null) //If alternatives points at null, I have to create an empty map.
this.alternatives = new HashMap<String, Float>();
else
{
this.alternatives = new HashMap<String, Float>(alternatives); //Map must be a copy.
this.title = title; //This is where my problem is happening.
}
}
Hier ist der Code für die getTitle Methode:
public String getTitle()
{
return this.title;
}
Der Test sagt immer wieder:
testGetTitle
Cause of failure:
java.lang.AssertionError: expected:<Family Guy> but was:<null>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:743)
at org.junit.Assert.assertEquals(Assert.java:118)
at org.junit.Assert.assertEquals(Assert.java:144)
at TestInterest.testGetTitle(TestInterest.java:56)
habe ich versucht, eine einige verschiedene Dinge, wie im Konstruktor habe ich versucht, eine Kopie der Zeichenfolge, oder in der GetTitle-Methode, versuchte ich einen neuen String (this.title) zurückgeben, aber ich habe immer noch den gleichen Fehler ... Ich habe auch versucht, mit Concat, aber es hat nicht funktioniert.
Und der Test versucht nur, das Programm mit vordefinierten Werten und Tests für jede Methode auszuführen.
Die zweite Methode, die ich mit ein Problem haben, ist die folgende:
@Override
public boolean equals(Object obj)
{
if (obj == this)
return true;
if (!(obj instanceof Interest)) {
return false;
}
if (obj instanceof Interest && this.title == ((Interest) obj).getTitle() && this.alternatives == ((Interest) obj).getAlternatives())
return true;
if (this == (Interest) obj)
return true;
else
return false;
}
Es hält mich zu sagen:
testEqualsObject
Cause of failure:
java.lang.AssertionError: Two Interests should be equal when identical.
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.assertTrue(Assert.java:41)
at TestInterest.testEqualsObject(TestInterest.java:104)
Ich dachte, ich alle Optionen der Gleichheit angesehen, aber nicht sicher ..
Jede Hilfe wäre wünschenswert, ich habe nicht so viel Programmiererfahrung, und ich versuche, Java zu lernen, und es wird manchmal frustrierend mit all diesen Komponententests ...
Gesamter Klassencode, wenn es hilft:
package jpp.exams.dating;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class Interest {
private String title;
private Map<String, Float> alternatives;
public Interest(String title, Map<String, Float> alternatives)
{
if (title.isEmpty() && title != null) //Title must contain something.
throw new IllegalArgumentException();
if (alternatives == null) //If alternatives points at null, I have to create an empty map.
this.alternatives = new HashMap<String, Float>();
else
{
this.alternatives = new HashMap<String, Float>(alternatives); //Map must be a copy.
this.title = title; //This is where my problem is happening.
}
}
public String getTitle()
{
return this.title;
}
public Map<String, Float> getAlternatives()
{
return new HashMap<String, Float>(alternatives);
}
public float matchAlternative(String alternative)
{
if (alternative == null || title == null)
throw new IllegalArgumentException();
else if (title.equals(alternative))
return 1f;
else if (this.alternatives.containsKey(alternative))
return (float) this.alternatives.get(alternative);
else
return 0f;
}
@Override
public String toString()
{
String s = title + "\n";
for (Map.Entry<String, Float> entry : this.alternatives.entrySet()) {
String key = entry.getKey();
Float f = entry.getValue();
s = s.concat("\t" + key + ": " + f + "\n");
}
s = s.substring(0, s.length() - 1); //removes last new line
return s;
}
@Override
public boolean equals(Object obj)
{
if (obj == this)
return true;
if (!(obj instanceof Interest)) {
return false;
}
if (obj instanceof Interest && this.title == ((Interest) obj).getTitle() && this.alternatives == ((Interest) obj).getAlternatives())
return true;
if (this == (Interest) obj)
return true;
else
return false;
}
public int hashCode()
{
return Objects.hash(title);
}
}
Weil Sie es nur in einem Zweig zuweisen ..... – Qix
Können Sie bitte weiter erklären? –
Beachten Sie auch, dass Sie 'title.isEmpty()' aufrufen, ohne zu überprüfen, ob 'title'' null' ist. Dies gefährdet eine NPE. –