2017-03-01 1 views
0

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); 
} 

}

+2

Weil Sie es nur in einem Zweig zuweisen ..... – Qix

+0

Können Sie bitte weiter erklären? –

+0

Beachten Sie auch, dass Sie 'title.isEmpty()' aufrufen, ohne zu überprüfen, ob 'title'' null' ist. Dies gefährdet eine NPE. –

Antwort

0

Problem ist, dass Sie die Klasse mit Alternativen Instanziieren = null

2

über den Nulltitel: Im Konstruktor , weisen Sie title nur einen Wert zu, wenn alternatives nicht null ist. Nehmen Sie den this.title = title; Teil aus dem Else-Block.

Über die Methode equals: Sie haben einige Vergleiche mit == wo Sie .equals verwendet haben sollte, so

ändern
if (obj instanceof Interest && this.title == ((Interest) obj).getTitle() && this.alternatives == ((Interest) obj).getAlternatives()) 

zu

if (this.title.equals(((Interest) obj).getTitle()) && this.alternatives.equals(((Interest) obj).getAlternatives())) 

(Sie werden bemerken, ich entfernt auch die instanceof -prüfen.Es ist nicht notwendig dort, da Sie bereits zurückgegeben würden, wenn das falsch war)

Verwandte Themen