2016-04-27 5 views
1

I Methode in Java-Klasse haben:Erwartung benutzerdefinierte Ausnahme statt Null-Zeiger-Ausnahme während junit Test

@Context 
UriInfo uriInfo; 
public void processRequest(@QueryParam ("userId") @DefaultValue("") String userId) 
{ 
    String baseURI = uriInfo.getBaseUri().toString(); 
    if(userId == null) 
    { 
     //UserIdNotFoundException is my custom exception which extends Exceptition 
     throw new UserIdNotFoundException(); 
    } 
} 

Wenn ich junit Prüfung des oben genannten Verfahrens erwartet für UserIdNotFoundException bin, wenn userId Parameter Null ist, erhalte ich die folgende Assertionsfehler: expected an instance of UserIdNotFoundException but <java.lang.NullPointerException> is java.lang.NullPointerException.

@Test 
public void testProcessRequest_throws_UserIdNotFoundException() 
{ 
    expectedException.expect(UserIdNotFoundException.class); 
    processRequest(null); 
} 

Meine benutzerdefinierte Ausnahmeklasse:

public class UserIdNotFoundException extends Exception 
{ 

    public UserIdNotFoundException() 
    { 

    } 

    public UserIdNotFoundException(String message) 
    { 
      super(message); 
    } 
} 

Antwort

2

ziehe ich die Anmerkung:

@Test(expected = UserIdNotFoundException.class) 
public void testProcessRequest_throws_UserIdNotFoundException() { 
    processRequest(null); 
} 

Das Problem könnte sein, dass Ihre processRequest Implementierung könnte die NPE schlagen werden, bevor Sie eine Chance zu überprüfen, für die Benutzer-ID haben.

Das ist eine gute Sache: Ihr Test zeigt, dass die Implementierung nicht Ihre Anforderung erfüllt. Du kannst es jetzt für immer reparieren.

Dafür ist TDD gut.

+0

Wie kann ich meine Implementierung schlagen Null Zeiger Ausnahme vor meiner Prüfung. Ich habe keine der String-Methoden auf userId aufgerufen.Oder ich verstehe deinen Standpunkt nicht. Auch nehme ich userId als Query Param von der URL. Es ist nur möglich, dass es sich um einen Null-Check handelt. – Ashley

+1

Sie müssten die Implementierung für processRequest veröffentlichen, damit ich das für Sie buchstabieren kann. Eine bessere, lehrreichere Idee könnte darin bestehen, den Prozess in einem Debugger zu durchlaufen. Setzen Sie einen Haltepunkt in der ersten Zeile von processRequest und sehen Sie, wie das beobachtete Verhalten nicht Ihren Erwartungen entspricht. – duffymo

+0

Ich debuggte es wie Sie vorgeschlagen. Der Fehler wurde in der Zeile uriInfo.getBaseUri(). ToString() angezeigt.So stelle ich diese Zeile nach der if-Prüfung ein. Der Test zeigt jetzt einen grünen Balken. Aber ich habe den Grund immer noch nicht verstanden. – Ashley

0

Sie müssen benutzerdefinierte Exception-Klasse schreiben this example könnte Ihnen helfen.

Beispielcode:

class UserIdNotFoundException extends Exception{ 
UserIdNotFoundException (String s){ 
    super(s); 
} 
} 

Test-Ausnahme:

public void processRequest(String userId) 
{ 
    if(userId == null) 
    { 
     //UserIdNotFoundException is my custom exception which extends Exception 
     throw new UserIdNotFoundException("SOME MESSAGE"); 
    } 
} 

entfernen Standardkonstruktors aus Ihrer Ausnahmeklasse, JVM erstellen implizit für Sie/

+0

Ich habe meine benutzerdefinierte Ausnahmeklasse geschrieben, aber immer noch denselben Assertionsfehler. – Ashley

+0

Aktualisierte Antwort, versuchen Sie es. –

+0

Wie wird das Entfernen des Konstruktors das obige Problem lösen? – Ashley

0

Sie haben wahrscheinlich nicht gesetzt uriInfo mit einem Wert und du rufst an eine Methode für einen Nullwert. Sind Sie sicher, dass der Test auf uriInfo eingestellt ist? Oder getBaseUri() könnte null zurückgeben und toString() aufrufen, könnte es die NullPointerException werfen. Dies würde durch Überprüfen des Rückgabewerts von getBaseUri() in einem Debugger erfolgen.

Normalerweise können Sie entweder Ihren Test mit einer Konfiguration mit Beans für Ihren Test ausführen oder Sie können Setter hinzufügen, um den Wert in Ihrer Testklasse festzulegen, um ihn zu testen oder einen Wert im Test anzugeben. Dies sollte helfen, NullPointerException zu vermeiden.

In beiden Fällen sollten Sie die Fehlerprüfung immer durchführen, bevor Sie eine echte Arbeit in einer Methode ausführen.