Activity in androidTest not getting launched by ActivityTestRule
Solution 1
Only use launchActivity
if you're passing in a custom Intent
to launch the Activity with. Otherwise just use true
in the constructor like so:
@Rule
public ActivityTestRule<TestFragmentActivity> rule =
new ActivityTestRule<>(TestFragmentActivity.class, false, true);
Otherwise, you can do something like this to pass in Activity parameters:
@RunWith(AndroidJUnit4.class) public class TestFragment {
@Rule
public ActivityTestRule<TestFragmentActivity> rule =
new ActivityTestRule<>(TestFragmentActivity.class, false, false);
private Activity launchedActivity;
@Before
public void setup() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.putExtra("parameter", "Value");
launchedActivity = rule.launchActivity(intent);
}
}
Solution 2
Looks like you have different packages. Error says com.bbm.TestFragmentActivity
but your package manager has com.example.achhatra.myapplication.TestFragmentActivity
I don't know your package structure so I can only guess ... change package in your test Android manifest to com.example.achhatra.myapplication.test
and put your test Activity in this package.
![Abdullah](https://i.stack.imgur.com/sT1bn.jpg?s=256&g=1)
Abdullah
Updated on June 12, 2022Comments
-
Abdullah about 2 years
I want to test a fragment in test activity. I added
TestTragmentActivity
toandroidTest
along withAndroidManifest.xml
file. But when I try to use this activity via anActivityTestRule
it gives following error:java.lang.RuntimeException: Could not launch activity at android.support.test.runner.MonitoringInstrumentation.startActivitySync(MonitoringInstrumentation.java:371) at android.support.test.rule.ActivityTestRule.launchActivity(ActivityTestRule.java:219) at com.bbm.ui.fragments.StickerPackListFragmentTest.testEmpty(StickerPackListFragmentTest.java:29) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at android.support.test.internal.statement.UiThreadStatement.evaluate(UiThreadStatement.java:55) at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:270) at org.junit.rules.RunRules.evaluate(RunRules.java:20) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runners.Suite.runChild(Suite.java:128) at org.junit.runners.Suite.runChild(Suite.java:27) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at org.junit.runner.JUnitCore.run(JUnitCore.java:115) at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59) at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:262) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1887) Caused by: java.lang.RuntimeException: Unable to resolve activity for: Intent { act=android.intent.action.MAIN flg=0x14000000 cmp=com.bbm.debug/com.bbm.TestFragmentActivity } at android.app.Instrumentation.startActivitySync(Instrumentation.java:391) at android.support.test.runner.MonitoringInstrumentation.access$201(MonitoringInstrumentation.java:90) at android.support.test.runner.MonitoringInstrumentation$5.call(MonitoringInstrumentation.java:351) at android.support.test.runner.MonitoringInstrumentation$5.call(MonitoringInstrumentation.java:348) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818)
The
TestFragmentActivity
is just an empty activity. Below is theAndroidManifest.xml
in theandroidTest
folder.<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.bbm"> <application android:label="@string/app_name" tools:replace="android:label"> <activity android:name=".TestFragmentActivity"></activity> </application> </manifest>
I tried to get some data about why this is happening. Below is my test:
@RunWith(AndroidJUnit4.class) public class TestFragment { @Rule public ActivityTestRule<TestFragmentActivity> rule = new ActivityTestRule<>(TestFragmentActivity.class, false, false); @Test public void testEmpty() { // Just for logging purpose printActivities(InstrumentationRegistry.getTargetContext(), "APP_TARGET_CONTEXT"); printActivities(InstrumentationRegistry.getContext(), "APP_CONTEXT"); // The launch fails.... rule.launchActivity(null); } private void printActivities(Context context, String tag) { try { ActivityInfo[] infos = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES).activities; for(ActivityInfo info : infos) { Log.d(tag, info.name); } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } Log.d(tag + "_PACKAGE_NAME", context.getPackageName()); } }
The output of above is:
10-06 18:46:45.419 13030-13052/com.example.achhatra.myapplication D/APP_TARGET_CONTEXT: com.example.achhatra.myapplication.MainActivity 10-06 18:46:45.419 13030-13052/com.example.achhatra.myapplication D/APP_TARGET_CONTEXT_PACKAGE_NAME: com.example.achhatra.myapplication 10-06 18:46:45.419 13030-13052/com.example.achhatra.myapplication D/APP_CONTEXT: com.example.achhatra.myapplication.TestFragmentActivity 10-06 18:46:45.419 13030-13052/com.example.achhatra.myapplication D/APP_CONTEXT_PACKAGE_NAME: com.example.achhatra.myapplication.test
As you can see the
TestFragmentActivity
is in theandroidTest
context and not in the target context. That is the reasonActivityTestRule
is not able to launch it.I would like to know how can I launch this
TestFragmentActivity
in this test. -
Abdullah over 7 yearsEven if I do not use
lauchActivity
and passtrue
in constructor it still fails. Also I do not need to pass any parameters to the activity.