2013-08-04 23 views
5

AndroidプロジェクトにはMavenでRobolectricを使用するのが初めてです。Robolectric + Maven

java.lang.IllegalStateException: immutable! 
    at org.robolectric.res.ResBundle$ResMap.merge(ResBundle.java:128) 
    at org.robolectric.res.ResBundle$ResMap.access$100(ResBundle.java:116) 
    at org.robolectric.res.ResBundle.mergeLibraryStyle(ResBundle.java:88) 
    at org.robolectric.res.OverlayResourceLoader.doInitialize(OverlayResourceLoader.java:26) 
    at org.robolectric.res.XResourceLoader.initialize(XResourceLoader.java:29) 
    at org.robolectric.res.XResourceLoader.getValue(XResourceLoader.java:53) 
    at org.robolectric.res.OverlayResourceLoader.getValue(OverlayResourceLoader.java:58) 
    at org.robolectric.res.RoutingResourceLoader.getValue(RoutingResourceLoader.java:31) 
    at org.robolectric.shadows.ShadowAssetManager.getAndResolve(ShadowAssetManager.java:263) 
    at org.robolectric.shadows.ShadowAssetManager.getAndResolve(ShadowAssetManager.java:259) 
    at org.robolectric.shadows.ShadowAssetManager.getResourceText(ShadowAssetManager.java:62) 
    at android.content.res.AssetManager.getResourceText(AssetManager.java) 
    at android.content.res.Resources.getText(Resources.java:225) 
    at android.content.res.Resources.getString(Resources.java:313) 
    at ****.loadRestServerUrl(****.java:417) 
    at ****.onCreate(****.java:201) 
    at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:146) 
    at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:387) 
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:227) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:177) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) 
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) 
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) 
:ここ

は、これはターゲット・テストを使用してMavenのに対して実行されたときに、私は次の例外を取得し、しかし、テストケース(それは本当に何もしない)

@RunWith(RobolectricTestRunner.class) 
public class UTest { 

private SplashActivity mActivity; 

@Before 
public void setUp() throws Exception { 
    mActivity = Robolectric.buildActivity(SplashActivity.class).create().get(); 
    ProgressBar bar = (ProgressBar) mActivity.findViewById(R.id.signInProgress); 
} 



@Test 
public void testingMe() throws Exception { 

} 
} 

です

誰かが問題の原因を知っていますか?私はRobolectric 2.1.1を使用しています。

+0

「3.0-rc2」と同じ問題が発生しました –

+1

@HieuRockerこの投稿はほぼ2歳です。 'RobolectricGradleTestRunner'を使うべきです。 –

+0

@ TLamこの問題の状態は何ですか? –

答えて

-1

私は間違いについて確信が持てません。しかし、私はこれを他の方法で試みました。 これを試すことができますか?

private MainActivity activityMain; 
private EditText edtTxtOne; 
private EditText edtTxtTwo; 
private Button btnDiv; 

@Before 
public void setUp() throws Exception { 
    activityMain = new MainActivity(); 
    activityMain.onCreate(null); 
    btnDiv = (Button) activityMain.findViewById(R.id.btnDiv); 
    edtTxtOne = (EditText) activityMain.findViewById(R.id.edtTxtNumberOne); 
    edtTxtTwo = (EditText) activityMain.findViewById(R.id.edtTxtNumberTwo); 
} 

@Test 
public void testDivButton() {} 

}

+0

まだ私に不変の!エラー。 –

+0

'activityMain =新しいMainActivity();' ??? – dsharew

+0

@Degen、あなたの主張は、私たちは、robolectricのnew演算子を持つオブジェクトインスタンスをアクティビティクラスに作成できないということですか? – jrhamza

1

これは、複数のスレッドが同時にリソースをロードしようとするRobolectricを引き起こして、リソースへのアクセスの問題でした。

これをhttps://github.com/robolectric/robolectric/pull/2353に修正しました。最新のスナップショットを使用する場合は、それが機能するはずです。そうでない場合は、3.1リリースを待つことができます。

あなただけApplication#onCreate()(例えばgetString(R.string.whateverを呼び出すのと同じ)、または任意の追加のスレッドが作成される前に実行される他のいくつかの方法でリソースを読み込む強制場合は、一時的な措置として、それは資源が複数の前にロードされていることを確認しますがスレッドはそれらを使用しようとします。

+0

こんにちは@Scott Kennedy、 どうすればアプリケーションのonCreate()でリソースを読み込むことができますか? – gZerone

+0

getString()を呼び出してください: –

+0

ありがとうございます。それは私のために働いた。あなたの答えは正しいものとしてマークされるべきです。 – gZerone