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()
?如果是這樣,怎麼樣?
謝謝,不知道那堂課。看起來像Robolectric創建一個目錄,如'/ tmp/<隨機串>/files'。我的目的是改變那個目錄,使它指向'/ tmp/<隨機串>/data/data/com.myapp/files'。我嘗試用部分模擬替換應用程序,以便'getFilesDir()'返回所需的路徑,但似乎沒有任何變化...... –
您可能需要部分模擬'getApplicationContext()'方法,並將其指向部分模擬原始上下文,以便將它指向需要的地方。這可能聽起來有點麻煩,所以其他選擇是使用一些依賴注入來重新實現上下文方法。 –
它的工作!我已經使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);' –