2017-11-14 2 views
1

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?

+0

Dies funktioniert nicht mit Mockit, da dieses Framework statische Methoden und/oder Klassen –

+0

nicht verwenden kann (und eigentlich nicht sollte) powermockito stattdessen verwenden –

+1

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. –

Antwort

1

static final ist kein großartiges Design. Es ist besser, die Abhängigkeit zu injizieren und das Framework (Frühling oder andere) sich darum kümmern zu lassen, das Singleton zu kontrollieren. Das sagte, in Ihrem Fall, verwenden Sie Reflexion, um die Factory instance Variable mit einem Mock Factory.

+0

Einverstanden. Singletons sind mehr Mühe, als sie die meiste Zeit wert sind, besonders wenn es um das Testen geht. In diesem Fall sind alle Probleme hausgemacht und sollten durch Refactoring behoben werden, anstatt neue Tools (wie PowerMock o.ä.) darauf zu werfen, zumal PowerMock nur Probleme löst, die Sie eigentlich gar nicht haben sollten. –