2014-04-15 9 views
6

Unten ist meine private Methode in meiner DataTap Klasse und ich JUnit Test versuchen diese private Methode JMockit mit -Wie übergibt man Null-String an eine private Methode mit jmockit beim Testen der Einheit?

private void parseResponse(String response) throws Exception { 
    if (response != null) { 
     // some code 
    } 
} 

den JUnit-Test Ich schrieb also unten wird für null Fall aber ist es NPE wirft irgendwie auf der Junit-Test selbst.

DataTap tap = new DataTap(); 
Deencapsulation.invoke(tap, "parseResponse", "hello"); 

// this line throws NPE 
Deencapsulation.invoke(tap, "parseResponse", null); 

Also meine Frage ist - Gibt es eine Möglichkeit, null string zu parseResponse Methode JMockit als Teil junit Prüfung passieren kann?

Dies ist, was ich auf dieser Linie sehe -

Das Argument vom Typ null explizit gegossen werden sollte [] für die Anrufung der varargs Methode invoke auf Object (Object, String, Object .. .) vom Typ Deencapsulation. Es könnte alternativ zu Objekt für einen Varargs-Aufruf

+0

Dieser Code sollte funktionieren. Ich denke, das Problem ist woanders. – tbodt

+0

Das, was ich in dieser Zeile sehen kann 'Das Argument vom Typ Null sollte explizit in Object [] für den Aufruf der Varargsmethode invoke (Object, String, Object ...) vom Typ Deencapsulation umgewandelt werden. Es könnte alternativ für einen Varargs-Aufruf in Object umgewandelt werden, und es ist tatsächlich fehlgeschlagen. – john

Antwort

14

Ein kurzer Blick at the documentation legt nahe, dass das, was Sie versuchen, mit dieser Signatur zu tun, ist nicht möglich:

... wenn ein Nullwert Bedürfnis sowie die Instanz übergeben, das Class-Objekt für den Parameter Typ werden muss stattdessen

weitergegeben werden, wenn das der Fall ist, übergeben Sie dann im Class Objekt.

Deencapsulation.invoke(tap, "parseResponse", String.class); 
+0

Danke Makoto. Ich habe das versucht und ich habe 'ungültigen Nullwert übergeben als ein Argument 1'. Irgendwelche Vorschläge, was ist los? – john

+1

Übergeben Sie das Class-Objekt * statt * von 'null', nicht zusätzlich:' Deencapsulation.invoke (tap, "parseResponse", String.class) '.Wegen der Überladung der Methode muss JMockit den Typ jedes Parameters kennen, damit er die gewünschte Methode durch Reflection finden kann; Ein solcher Typ kann nur aus einem Nicht-Null-Argument * oder * bestimmt werden, indem er explizit im Aufruf von 'invoke (...)' übergeben wird. –

+0

Docs jetzt unter: http://jmockit.org/tutorial/ReflectionUtilities.html#deencapsulatingMethods – jordanpg

0

umgewandelt werden. Tun Sie, was der Fehler sagt. Das heißt, die Linie dies ändern:

Deencapsulation.invoke(tap, "parseResponse", (Object) null); 
+0

Danke tbodt. Ich habe das ausprobiert und ich habe 'ungültigen Nullwert übergeben als Argument 0'. Irgendwelche Vorschläge, was ist los? – john

0

ich so tat, als ich null String in toString-Methode übergeben muß, dh über die null in der gewünschten Art Casting

mockedObject.toString((String) null) 
0

Sie die bequeme Methode verwenden, und Sie müssen die volle Methode verwenden, . Es gibt zwei Methoden, um eine Methode für eine Objektinstanz aufzurufen. Die erste Methode funktioniert, indem die ParameterTypes von nonNullArgs abgerufen werden.

Deencapsulation.invoke(instance, methodName, nonNullArgs); 
Deencapsulation.invoke(instance, methodName, parameterTypes, methodArgs); 

Sie müssen in den parameterTypes passieren, wenn eines der Argumente wie diese null ist:

DataTap tap = new DataTap(); 
String response = null; 
Class[] parameterTypes = { String.class }; 
Deencapsulation.invoke(tap, "parseResponse", parameterTypes, response); 
Verwandte Themen