I want to test a fragment in test activity. I added TestTragmentActivity
to androidTest
along with AndroidManifest.xml
file. But when I try to use this activity via an ActivityTestRule
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 the AndroidManifest.xml
in the androidTest
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 the androidTest
context and not in the target context. That is the reason ActivityTestRule
is not able to launch it.
I would like to know how can I launch this TestFragmentActivity
in this test.
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);
}
}
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With