java - 如何在无 Activity 类中测试 Intent
问题描述
我正在尝试创建一个创建 Intent 并启动新 Activity 的类,现在我在测试它时遇到了问题。
private static final String TAG = IntentToActivity.class.getSimpleName();
// ----------------
// START VARIABLES
// ----------------
private String fqClassName;
private Intent intentToActivity;
private Context context;
// --------------
// END VARIABLES
// --------------
/**
* Constructor sets needed variables, creates and performs intent
* @param fqClassName full qualified class name to intent to
* @param context context of the current using activity
*/
public IntentToActivity(String fqClassName, Context context) {
this.fqClassName = fqClassName;
this.context = context;
performIntent();
}
/**
* Creates and performs intent
*
* IMPORTANT: Intent must be referented in the manifest of the application use following code:
* <intent-filter>
* <action android:name="com.example.exampleapplication.ExampleClass" />
* <category android:name="android.intent.category.DEFAULT" />
* </intent-filter>
*/
private void performIntent() {
if (fqClassName != null) {
try {
intentToActivity = new Intent(fqClassName);
context.startActivity(intentToActivity);
} catch (Exception e) {
Log.e(TAG, "performIntent error: ", e);
}
}
}
}
我的安卓测试
公共类 IntentToActivityTest { @Rule public IntentsTestRule intentsRule = new IntentsTestRule<>(IntentToActivity.class);
@Test
public void newActivityLaunchingTest() {
Intents.intended(IntentMatchers.hasComponent("com.example.mmal.example.auth.IntentToActity2Example"));
}
我的第一个问题,如何开始测试我的第二个问题,如何实现非活动类作为规则
当前错误日志:
java.lang.RuntimeException: Could not launch activity
at androidx.test.runner.MonitoringInstrumentation.startActivitySync(MonitoringInstrumentation.java:467)
at androidx.test.rule.ActivityTestRule.launchActivity(ActivityTestRule.java:354)
at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:525)
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 androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:104)
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 androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:388)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2108)
Caused by: java.lang.RuntimeException: Unable to resolve activity for: Intent { act=android.intent.action.MAIN flg=0x14000000 cmp=com.motionminers.mmal.test/com.motionminers.mmal.backend.mv.IntentToActivity }
at android.app.Instrumentation.startActivitySync(Instrumentation.java:447)
at androidx.test.runner.MonitoringInstrumentation.access$101(MonitoringInstrumentation.java:98)
at androidx.test.runner.MonitoringInstrumentation$4.call(MonitoringInstrumentation.java:443)
at androidx.test.runner.MonitoringInstrumentation$4.call(MonitoringInstrumentation.java:440)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
解决方案
您不应该测试 Android 类。这是因为mock它,是一项非常繁重和艰苦的工作。
在 MVP 架构中,您可以将 Intent 数据(例如 String)传递给 Presenter,这样他就可以分析这些数据并告诉 View(Activity)如何表现。
因此,在这个示例场景中,您可以在构造函数中传递任何 String 数据并测试 Presenter 是否调用了某个 View 方法。
推荐阅读
- regex - 如何在 perl 正则表达式的 bash 变量中转义正斜杠?
- ubuntu - Julia 问题:错误:UndefVarError:JacobiRec 未定义
- node.js - 如何添加新的 ACL 中间件?
- python - 多变量分组
- python - 从 dict 创建数据帧并附加它们
- java - 在摇摆中突出显示用户输入标签
- java - Apache Camel Route 正在自动启动
- c# - 参考客户端 (UA.-.NETStandard-master) 是 BadNotConnected
- jenkins - 下载了“sonarqube-ant-task-2.7.0.1612.jar”并使用它设置类路径,但它不起作用
- c# - 使用分隔路径/键将复杂对象添加到 JObject