Ich habe eine Klasse wie:Mock Methoden auf statische Instanz
public class Factory {
private static final Factory instance = new Factory();
private Factory() {
}
public static Factory getInstance() {
return instance;
}
private Client client = null;
//To be mocked
//Failing at this point
//Not actually using mocked method
public Client getClient(Properties properties) {
//doSomething
//...
return client;
}
}
In einer anderen Klasse obigen Verfahren verwendet werden, wie:
public class Service {
protected Client client = null;
protected void keySetup() {
//Should be mocked
client = Factory.getInstance().getClient(properties());
...
...
}
}
für Unit-Tests der keySetup() -Methode, Ich versuche, spot die Factory.getInstance(). getClient (properties()) aber ich versage.
Ich versuche Sie folgendermaßen vorgehen:
@Test
public void testKeySetupTrue(){
Client client = mock(Client.class);
Factory factory = mock(Factory.class);
ReflectionTestUtils.setField(factory, "client", client);
Properties properties = mock(Properties.class);
Mockito.doReturn(client).when(factory)
.getClient(properties);
Service service = new Service();
service.keySetup();
...
...
}
Als ich im Debug-Modus sah ich es tatsächlich war die Ausführung der getClient (Eigenschaften Eigenschaften), die verspottet wurde.
Wie löst man das?
Dies funktioniert nicht mit Mockit, da dieses Framework statische Methoden und/oder Klassen –
nicht verwenden kann (und eigentlich nicht sollte) powermockito stattdessen verwenden –
Laut @MaciejKowalskis Antwort könnten Sie [PowerMock] (https : //github.com/powermock/powermock), aber ich würde Ihnen das nicht empfehlen, da dieses Framework den Bytecode ändert, so dass Sie nicht Ihren ursprünglich entworfenen Code haben, der zu ungewolltem/unerwartetem Verhalten führen könnte. Ich würde empfehlen, Ihre Klassen neu zu gestalten, um den Code testen zu können. –