我们说我有一个带有输入字段和按钮的应用程序。当用户输入正确的数字并按下按钮时,我创建一个新的Activity。如何使用Espresso测试正确的意图被触发并且新活动中的所有内容都已到位?
答案 0 :(得分:0)
我知道您有一个EditText和一个Button,当用户点击该按钮时,只要编辑文本中的文本等于特定文本,您就会开始一个新活动。
这是一个包含解释的完整工作代码:
让我们说具有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>
创建实现以下逻辑的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
在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类进行比较
如果有不清楚的地方,请你告诉我吗?