2017-07-20 65 views
3

我只是想測試一下,獲取一個字符串資源等於我認爲它應該等於什麼。我的問題似乎是我的項目中有Realm。我知道Robolectric不支持Realm(它在文檔中聲明),但我根本不調用Realm,所以我覺得可能有辦法做到這一點。Android - 用Robolectric測試一個字符串資源

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.robolectric.RobolectricTestRunner; 
import org.robolectric.RuntimeEnvironment; 
import org.robolectric.annotation.Config; 

import static org.junit.Assert.assertEquals; 

@RunWith(RobolectricTestRunner.class) 
@Config(constants = BuildConfig.class, sdk = 21, manifest = "app/src/main/AndroidManifest.xml") 
public class ResourceTester { 

    @Test 
    public void testingString() { 
     String resourceString = RuntimeEnvironment.application.getString(R.string.app_name); 
     assertEquals(resourceString, "Yeah"); 
    } 

} 

它看起來像它IS試圖調用境界

java.lang.UnsatisfiedLinkError: Can't load library: 
/var/folders/3x/ddxtg5fs1hxgqrp6h63vsc140000gp/T/android-tmp- 
robolectric3612430387389787158/app_lib/librealm-jni.dylib.3.5.0 

編輯:我嘗試做更多的事情,而且好像在@Config註釋設置manifest是問題,但後來我得到一個android.content.res.Resources$NotFoundException: unknown resource 2131362072

任何其他的想法?我可以創建另一個應用程序類,其中Realm未被調用嗎?/test目錄如何知道?

編輯大衛:

我嘗試這樣做:

@RunWith(RobolectricGradleTestRunner.class) 
@Config(application = TestingApplication.class, constants = BuildConfig.class, sdk = 21) 
public class ResourceTester { 
    @Test 
    public void newTestingTests() throws Exception { 
     String appName = RuntimeEnvironment.application.getString(R.string.app_name); 
    } 
} 

但我得到一個:

android.content.res.Resources$NotFoundException: unknown resource 2131362072

如果我將其更改爲

@RunWith(RobolectricTestRunner.class) 
//@RunWith(RobolectricGradleTestRunner.class) 
@Config(application = TestingApplication.class, constants = BuildConfig.class, sdk = 21) 
public class ResourceTester { 
    @Test 
    public void newTestingTests() throws Exception { 
     String appName = RuntimeEnvironment.application.getString(R.string.app_name); 
    } 
} 

我得到

WARNING: No manifest file found at ./AndroidManifest.xml.Falling back to the Android OS resources only. 
To remove this warning, annotate your test class with @Config(manifest=Config.NONE). 

android.content.res.Resources$NotFoundException: unknown resource 2131362072 
+0

Robolectric是什麼版本? – EpicPandaForce

+0

@EpicPandaForce我目前正在使用3.0的robolectric,但我可以使用任何版本3.0及以上。 – EGHDK

+0

您是否有Robolectric調用的自定義應用程序類,然後該類在測試期間調用Realm.init(Context)? – EpicPandaForce

回答

7

如果你有一個重量級的應用程序類別(例如,與境界的依賴,Crashlytics等)和單元測試沒有提到這些,你可以使用android.app.Application作爲應用程序類配置:

@RunWith(RobolectricTestRunner.class) 
@Config(application = android.app.Application.class, manifest="src/main/AndroidManifest.xml", sdk = 23) 
public class ResourceTester { 

另外,還要確保你有Working Directory設置爲$MODULE_DIR$如果你使用的是Mac或Linux爲每getting started instructions

module dir in working directory

+0

嗯......我覺得我現在更近了。檢查我的編輯。另外,我已經添加了$ MODULE_DIRS $。謝謝你的提醒。 – EGHDK

+0

有沒有什麼方法可以調試這個。例如...檢查它在測試中加載的資源/包/目錄,以及我的字符串資源實際在哪裏? – EGHDK

+0

@EGHDK你可以在測試運行器參數的清單中添加嗎?應該是'app/src/main/AndroidManifest。xml'或'src/main/AndroidManifest.xml'。你必須重新啓動Android Studio我認爲如果你改變了模塊目錄。如果您使用自定義應用程序進行測試,請去掉'constants = Build.config'。所以請儘量貼近我放在我的例子中的代碼。 –