如果满足特定条件,如何测试新活动的UI?

时间:2017-01-30 12:20:32

标签: java android testing android-intent android-espresso

我们说我有一个带有输入字段和按钮的应用程序。当用户输入正确的数字并按下按钮时,我创建一个新的Activity。如何使用Espresso测试正确的意图被触发并且新活动中的所有内容都已到位?

1 个答案:

答案 0 :(得分:0)

我知道您有一个EditText和一个Button,当用户点击该按钮时,只要编辑文本中的文本等于特定文本,您就会开始一个新活动。

这是一个包含解释的完整工作代码:

activity_home.xml

让我们说具有Button和EditText的活动是HomeActivity

按以下方式创建布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_home"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin">

    <EditText
        android:id="@+id/edit_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Go" />
</LinearLayout>

HomeActivity.java

创建实现以下逻辑的java活动:

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class HomeActivity extends AppCompatActivity {
    private EditText editText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        editText = (EditText)findViewById(R.id.edit_text);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String text = editText.getText().toString();
                if (text.equals("1")) {
                    Intent intent = new Intent(HomeActivity.this, ThirdActivity.class);
                    startActivity(intent);
                }
            }
        });
    }
}

请注意,我在这里只是检查文本是否等于 1 然后我开始一个新活动,我称之为ThirdActivity

HomeActivityText.java

在androidTest文件夹中创建一个名为HomeActivityText的类

import android.app.Activity;
import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.Espresso;
import android.support.test.espresso.action.ViewActions;
import android.support.test.espresso.matcher.ViewMatchers;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;
import android.support.test.runner.lifecycle.Stage;

import junit.framework.Assert;

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.Collection;

@RunWith(AndroidJUnit4.class)
public class HomeActivityTest {
    @Rule
    public ActivityTestRule<HomeActivity> mActivityRule =
            new ActivityTestRule<>(HomeActivity.class);

    @Test
    public void testHappyScenario() {
        Espresso.onView(ViewMatchers.withId(R.id.edit_text)).perform(ViewActions.typeText("1"));
        Espresso.onView(ViewMatchers.withId(R.id.button)).perform(ViewActions.click());
        Assert.assertEquals(getActivityInstance().getClass(), ThirdActivity.class);
    }

    private Activity getActivityInstance() {
        final Activity[] currentActivity = {null};
        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
            public void run() {
                Collection resumedActivities = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
                if (resumedActivities.iterator().hasNext()) {
                    currentActivity[0] = (Activity) resumedActivities.iterator().next();
                }
            }
        });

        return currentActivity[0];
    }

}

当您输入 1 作为编辑文本的值时,测试将会通过,否则将失败。

单元测试的代码是模拟快乐场景,在其中您将值 1 设置为编辑文本然后单击按钮然后检查新活动是否已启动

请注意,我开发了一个函数来检索设备中显示的最后一个活动,并将其类与预期的ThirdActivity类进行比较

如果有不清楚的地方,请你告诉我吗?