2013-08-04 3 views
5

Je suis nouveau à utiliser Robolectric avec Maven pour un projet Android.Robolectric + Maven

est ici le cas de test (il n'a pas vraiment rien)

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

} 
} 

Cependant, lorsque cela est exécuté sur Maven en utilisant le test cible, je reçois l'exception suivante:

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) 

Est-ce que quelqu'un sait quel pourrait être le problème? J'utilise Robolectric 2.1.1.

+0

Je reçois le même problème avec '3.0-rc2' –

+1

@HieuRocker Ce post a presque 2 ans. Vous devriez utiliser 'RobolectricGradleTestRunner'. –

+0

@TLam Quel est le statut de ce problème? –

Répondre

-1

Je ne suis pas sûr de l'erreur, vous obtenez. Mais j'ai essayé cela d'une autre manière. Pouvez-vous essayer cela?

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

Toujours en me donnant un immuable! Erreur. –

+0

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

+0

@Degen, votre point est que nous ne pouvons pas créer d'instance d'objet avec un nouvel opérateur dans robolectric pour les classes d'activité? – jrhamza

1

C'était un problème avec plusieurs threads accès aux ressources, ce qui Robolectric pour tenter de charger les ressources en même temps.

J'ai corrigé cela dans https://github.com/robolectric/robolectric/pull/2353. Si vous utilisez le dernier instantané, cela devrait fonctionner, ou vous pouvez attendre la version 3.1. Comme mesure temporaire, si vous forcez le chargement d'une ressource dans Application#onCreate() (par exemple en appelant getString(R.string.whatever) ou une autre méthode qui sera exécutée avant la création de threads supplémentaires, les ressources seront chargées avant plusieurs threads essayent de les utiliser.

+0

Salut @ Scott Kennedy, S'il vous plaît aider, comment pouvons-nous forcer la ressource de chargement dans Application # onCreate()? – gZerone

+0

Il suffit d'appeler getString() :) –

+0

Merci beaucoup. Cela a fonctionné pour moi. Votre réponse devrait être marquée comme la bonne. – gZerone

Questions connexes