2016-07-27 44 views
0

我有一個受保護的方法,如下所示。它使用來自Constants.java文件的最終靜態變量。通過更改最終靜態變量來測試方法

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; 
     } 
    } 
} 

現在我想單元測試這種方法processremote config失敗。

如果我只是測試process()方法,它將通過Constants.java具有適當的連接值。爲了測試,我想更改這些值,以便遠程配置returnsnull;

注意:我們不希望使用Mockito來模擬這些值。

+0

我很困惑...爲什麼你不能暫時改變constants.java中的值? – Austin

+0

@Austin:他將測試作爲CI作業的一部分運行,所以我不想更改實際值。我們也不想用Mockito來嘲諷價值。 – tushR

+0

那麼你不能改變任何代碼嗎? – Austin

回答

1

使用模擬框架,如Mockito,你可以定義A間諜中,你可以指定connectConfig()結果:

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

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

你可以嘗試改變常數值與byteman。它應該完成這項工作。

0

使用模擬框架幾乎總是這種問題的錯誤答案。改爲使用依賴注入。