2015-07-13 49 views
1

爲了「虛擬化」我的應用程序在測試環境中運行的文件系統,我想要shadow Context.getFilesDir(),但找不到正確的封閉類來映射。Robolectric 3中的shadowing getFilesDir()

我試圖遮蔽Context

@Implements(Context.class) 
public class MyShadow extends ShadowContext { 
    private File testRoot; 

    public MyShadow() { 
     testRoot = new File(FileUtils.getTempDirectory(), "androidTestRoot-" + System.currentTimeMillis()); 
    } 

    @Implementation 
    public File getFilesDir() { 
     return new File(testRoot, "data/data/com.myapp/files"); 
    } 
} 

但方法不會被調用,因爲很明顯我的應用程序調用ContextWrapper.getFilesDir()未陰影。

ContextWrapper被Robolectric的ShadowContextWrapper遮蔽。但是,即使我的影子ContextWrapper改變我的類頭爲

@Implements(ContextWrapper.class) 
public class MyShadow extends ShadowContextWrapper 

不叫太我的方法。

ShadowContext,超類ShadowContextWrapper,是Context的影子,但我找不到getFilesDir()這個被調用的具體實現。

所以我的問題是:是否有可能影響getFilesDir()?如果是這樣,怎麼樣?

回答

2

我真的不知道,你正在試圖做什麼,但我已經使用下列以獲得對Robolectric測試數據目錄:

RuntimeEnvironment.application.getApplicationContext().getFilesDir(); 

從我已經能夠創建虛擬文件無論在測試中需要什麼目的。希望能幫助到你。

+0

謝謝,不知道那堂課。看起來像Robolectric創建一個目錄,如'/ tmp/<隨機串>/files'。我的目的是改變那個目錄,使它指向'/ tmp/<隨機串>/data/data/com.myapp/files'。我嘗試用部分模擬替換應用程序,以便'getFilesDir()'返回所需的路徑,但似乎沒有任何變化...... –

+0

您可能需要部分模擬'getApplicationContext()'方法,並將其指向部分模擬原始上下文,以便將它指向需要的地方。這可能聽起來有點麻煩,所以其他選擇是使用一些依賴注入來重新實現上下文方法。 –

+0

它的工作!我已經使RuntimeEnvironment.application.getApplicationContext()指向RuntimeEnvironment.appilcation本身:'File filesDir = new File(testRoot,「data/data /」+ RuntimeEnvironment.application.getPackageName()+「/ files」); RuntimeEnvironment.application = spy(RuntimeEnvironment.application); (RuntimeEnvironment.application.getApplicationContext())。然後返回(RuntimeEnvironment.application);當(RuntimeEnvironment.application.getFilesDir())。然後返回(filesDir);' –