Mocking Reflexion basierte Anrufe
Ich versuche zu verspotten einige Reflexion basierenden Methoden. Unten können Sie sehen, die details,
Klasse Unter Test
public class TracerLog {
@AroundInvoke
public Object logCall(InvocationContext context) throws Exception {
Logger logger = new Logger();
String message = "INFO: Invoking method - "
+ context.getMethod().getName() + "() of Class - "
+ context.getMethod().getDeclaringClass();
logger.write(message);
return context.proceed();
}
}
Test
public class TracerLogTest {
@Mock
InvocationContext mockContext;
@Mock
Logger mockLogger;
@InjectMocks
private TracerLog cut = new TracerLog();
@BeforeMethod
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void logCallTest() throws Exception {
when(mockContext.proceed()).thenReturn(true);
when(mockContext.getMethod().getDeclaringClass().getName()).thenReturn("someClass");
cut.logCall(mockContext);
verify(mockContext).proceed();
}
}
oder
@Test
public void logCallTest() throws Exception {
when(mockContext.proceed()).thenReturn(true);
when(mockContext.getMethod().getName()).thenReturn("someMethod");
when(mockContext.getMethod().getDeclaringClass().getName()).thenReturn("someClass");
cut.logCall(mockContext);
verify(mockLogger).write(anyString());
verify(mockContext).proceed();
}
Aber, die tests fehlschlagen mit einer NullPointerException. Ich verstehe, dass ich bin, etwas falsch zu machen gegen Spott Konzepte, aber ich verstehe nicht, was es ist. Könntest du bitte werfen etwas Licht auf ihn und auch mir empfehlen, wie diese Methode getestet werden kann?
Dank.
- Wie erstellen Sie Ihre mock-Objekte und Ihr Objekt unter test? Können Sie Ihre gesamte test-Klasse, nicht nur die test-Methode? Danke.
- Ich habe nun bearbeitet Sie die Frage, enthalten den vollständigen code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Benötigen Sie eine Methode, Objekt und einem Objekt der Klasse. Wie pro Ihren Kommentar, Mockito nicht simulieren Sie eine Methode, so müssen Sie eine echte. Habe ich noch nicht getestet, aber ich glaube, dass das funktionieren würde. Statt:
Benötigen Sie:
Offensichtlich
getName()
wird nicht zurückkehren "someMethod" mehr undgetDeclaringClass().getName()
zurück, der name dieser Testklasse (im Beispiel), aber obwohl Sie konnte nicht wählen, was Sie zurückgeben, was Sie zurückgeben, ist immer noch deterministisch, so dass Sie sollten in der Lage sein, um zu überprüfen, alles, was Sie brauchen. (Natürlich, wenn Sie benötigt wird, um auszuspionieren, oder stellen Sie sicher, dass ein Anruf getätigt wurde auf die Methode Objekt selbst, du bist immer noch stecken.)Ja das problem ist, dass
mockContext.getMethod()
wird null zurückgegeben. Also jedes mal, wenn Sie dies ausführen, dann rufen Sie etwas, auf das Ergebnis (getDeclaringClass() oder getName()) du bekommst die NPE. Sie wollen wahrscheinlich verwenden Sie dieRETURNS_DEEP_STUBS
Standard-Antwort, wenn Sie die mock. So etwas wiesollte den trick tun.
Method testMethod = YourOwnClass.class.getDeclaredMethod("someMethod"); when(invocationContext.getMethod()).thenReturn(testMethod);
. Noch besser wäre es, tatsächlich erstellen Sie Ihre eigene Instanz von InvocationContext, anstatt lustig (also keine mock-Typen, die Sie nicht besitzen). Ich hoffe, das hilft.InvocationContext
(Aber vermeiden, so viel wie möglich sehen, die 4-5 ersten google-Ergebnisse google.fr/...). Vielleicht gibt es ein paar Projekte, die zum Ziel haben, JEE unit-test-Unterstützung (nicht die Arquillian Weg, die eigentlich deploy EJBs).