2013-08-04 19 views
5

Jestem nowy w używaniu Robolectric z Maven dla projektu Android.Robolectric + Maven

Oto przypadek testowy (to naprawdę nie ma nic)

@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 { 

} 
} 

Jednak, gdy ten jest prowadzony przed Maven za pomocą testu docelowy, pojawia się następujący wyjątek:

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) 

Czy ktoś wie, jaki może być problem? Używam programu Robolectric 2.1.1.

+0

Otrzymuję ten sam problem z '3.0-rc2' –

+1

@HieuRocker Ten wpis ma prawie 2 lata. Powinieneś używać 'RobolectricGradleTestRunner'. –

+0

@TLam Jaki jest status tego problemu? –

Odpowiedz

-1

Nie jestem pewien co do błędu, który otrzymujesz. Ale próbowałem tego w inny sposób. Czy możesz tego spróbować?

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

Wciąż daje mi niezmienny! błąd. –

+0

'activityMain = new MainActivity();' ??? – dsharew

+0

@Degen, chodzi o to, że nie możemy stworzyć instancji obiektu z nowym operatorem w robolectric dla klas aktywności? – jrhamza

1

To był problem z wielu wątków dostępu do zasobów, powodując Robolectric próbować załadować zasobów jednocześnie.

Naprawiłem to w https://github.com/robolectric/robolectric/pull/2353. Jeśli używasz najnowszej migawki, powinna działać, lub możesz poczekać na wydanie wersji 3.1.

Jako środek tymczasowy, jeśli tylko wymusić ładowanie zasobu w Application#onCreate() (takich jak wywołując getString(R.string.whatever) lub jakaś inna metoda, która zostanie uruchomiona przed wszelkie dodatkowe wątki są tworzone, to zapewnienie zasobów zostały załadowane przed wielokrotności wątki próbują z nich korzystać.

+0

Witam @Scott Kennedy, Proszę pomóc, jak możemy wymusić ładowanie zasobu w aplikacji # onCreate()? – gZerone

+0

Po prostu zadzwoń getString() :) –

+0

Wielkie dzięki. To zadziałało dla mnie. Twoja odpowiedź powinna być oznaczona jako właściwa. – gZerone

Powiązane problemy