2016-07-27 14 views
0

Ich habe eine geschützte Methode, die wie folgt aussieht. Es verwendet endgültige statische Variablen aus einer Constants.java-Datei.Testen Sie eine Methode durch Ändern der endgültigen statischen Variablen

class A { 
    protected Configuration connectConfig() { 
     ConfigDescriptor desc = new ConfigDescriptor.Builder() 
      .project(Constants.REMOTE_CONFIG_PROJECT_NAME) 
      .name(Constants.REMOTE_CONFIG_PROJECT_CONFIG_NAME) 
      .version(Constants.REMOTE_CONFIG_PROJECT_VERSION) 
      .build(); 

     return ConfigProvider.of(desc, getClass().getClassLoader()); 
    } 

    public boolean process() { 
     Configuration config = connectConfig(); 
     if(config == null) { 
      return false; 
     } 
    } 
} 

Jetzt möchte ich Unit-Test diese Methode process für die remote config zum Scheitern verurteilt.

Wenn ich nur process() Methode testen, wird es übergeben, da die Constants.java richtige Werte zu verbinden hat. Zum Testen möchte ich diese Werte so ändern, dass die Remote-Konfiguration returnsnull;

Hinweis: Wir möchten Mockito nicht verwenden, um die Werte zu überspielen.

+0

Ich bin verwirrt ... warum können Sie nicht einfach die Werte in constants.java vorübergehend ändern? – Austin

+0

@Austin: Er Tests laufen als Teil eines CI-Jobs, so dass ich nicht die tatsächlichen Werte ändern möchte. Wir wollen auch nicht Mockito verwenden, um die Werte zu verspotten. – tushR

+0

Können Sie den Code dann nicht ändern? – Austin

Antwort

1

einen Mockframework Mit wie Mockito können Sie einen Spion von A definieren, in dem Sie das Ergebnis connectConfig() angeben:

A spy = spy(new A()); 
doReturn(null).when(spy).connectConfig(); 

Assert.assertFalse(spy.process()); 
1

Sie können versuchen, konstante Werte zu ändern, mit byteman. Es sollte die Arbeit machen.

0

Die Verwendung eines spöttischen Rahmens ist fast immer die falsche Antwort auf diese Art von Frage. Verwenden Sie stattdessen die Abhängigkeitsinjektion.