在我的机器人电测试中,我写了一个
@Rule
public ActivityScenarioRule<AppCompatActivity> activityScenarioRule =
new ActivityScenarioRule<>(AppCompatActivity.class);
@Rule
public ActivityScenarioRule<FragmentUtilActivity> activityScenarioRule2 =
new ActivityScenarioRule<>(FragmentUtilActivity.class);
和一个内部类:
private static class FragmentUtilActivity extends FragmentActivity {
public static int anchorId = 200;
private StandaloneAccountMenuDialogFragment<FakeAccount> dialogFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout view = new LinearLayout(this);
view.setId(anchorId);
setContentView(view);
}
}
但是当我运行代码时,它失败了。
第一个规则有效但第二个规则无效的原因是什么?
Unable to resolve activity for Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.myComp..internal/.StandaloneAccountMenuDialogFragmentTest$FragmentUtilActivity } -- see https://github.com/robolectric/robolectric/pull/4736 for details
java.lang.RuntimeException:
at org.robolectric.android.fakes.RoboMonitoringInstrumentation.startActivitySyncInternal(RoboMonitoringInstrumentation.java:48)
at org.robolectric.android.internal.LocalActivityInvoker.startActivity(LocalActivityInvoker.java:34)
at androidx.test.core.app.ActivityScenario.launch(ActivityScenario.java:205)
at androidx.test.core.app.ActivityScenario.launch(ActivityScenario.java:182)
at androidx.test.ext.junit.rules.ActivityScenarioRule.lambda$new$0(ActivityScenarioRule.java:68)
at androidx.test.ext.junit.rules.ActivityScenarioRule.before(ActivityScenarioRule.java:82)
at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:46)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.robolectric.RobolectricTestRunner$HelperTestRunner$1.evaluate(RobolectricTestRunner.java:546)
at org.robolectric.internal.SandboxTestRunner$2.lambda$evaluate$0(SandboxTestRunner.java:252)
at org.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:89)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
我刚刚遇到了同样的问题,并意识到我忘记包含
android {
...
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
在我的新项目的 build.gradle 中。
结果是该清单无法被Robolectric使用。
Robolectric 现在要求在清单中定义活动。来自发行说明的已知问题部分:
现在必须在清单中明确声明活动(就像 普通 Android 的情况);然而,Android Gradle Plugin 没有 当前合并一个测试清单。
这对于库来说是有问题的,因为清单中的任何内容都会合并到库使用者的清单中。有一个解决方法,但它需要创建一个新的 Gradle 模块。希望 AGP 错误能够尽快得到修复。同时,我希望使用已弃用的
Robolectric.setupActivity()
方法。
如果您尝试运行 Robolectric 测试来测试某些可组合项,请确保将其包含在模块的清单中
<activity android:name="androidx.activity.ComponentActivity" />
。如果这解决了问题,那么问题不是由 Robolectric 引起的,而是由 Jetpack Compose 测试设置引起的 “RuntimeException:无法启动活动...无法解析 Intent 的活动”使用 createComposeRule 运行 Jetpack Compose UI 测试时
如果您正在使用
build.gradle.kts
,您可能会丢失:
android {
...
testOptions {
unitTests {
isReturnDefaultValues = true
}
}
}