Java 如何在无活动类中测试意图

Java 如何在无活动类中测试意图,java,android,unit-testing,android-intent,android-espresso,Java,Android,Unit Testing,Android Intent,Android Espresso,我试图创建一个类,创建一个意图并开始一个新的活动,现在我在测试它时遇到了问题 private static final String TAG = IntentToActivity.class.getSimpleName(); // ---------------- // START VARIABLES // ---------------- private String fqClassName; private Intent intentToActivity; private Context

我试图创建一个类,创建一个意图并开始一个新的活动,现在我在测试它时遇到了问题

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);
        }
    }
}
我的第一个问题,如何开始测试的意图 第二,如何按照规则实现非活动类

当前错误日志:

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类。这是因为模仿它,是一项非常繁重而艰苦的工作

在MVP体系结构中,您可以将意图数据(例如字符串)传递给演示者,这样他就可以分析这些数据并告诉查看(活动)如何行为


因此,在这个示例场景中,在构造函数中,您可以传递任何字符串数据并测试Presenter是否调用某个视图方法。

您认为我应该对输入进行单元测试吗?不是意图?是的,如果意图的数据中有布尔值,您将测试整个意图功能?不,您只对布尔值感兴趣,所以您将使用此布尔值。因此,调用类并将意图返回到unittest以检查其是否为真。。。听起来很有趣。或者你是说别的什么?哦。。。不,不,您的测试类不包含任何对Android类的引用。假设您有一个ExamplePresenter(boolean IsLegacModelEnabled),因此在您的测试类中可以创建一个测试方法来验证view方法在该标志为true或false时如何调用。在活动实施中,您将有:。。。。presenter=新的ExamplePresenter(Intent.getData(标志));你能解释得更具体一点吗?我需要如何测试这个案例?
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)