这篇文章记录下单元测试。流程是通过点击A这个Activity的Button按钮,通过Intent携带数据,然后跳转到B这个Activity。
注意:单元测试一般不适合测试与系统有复杂交互的UI。
先上被测试的Activity的代码:
public class LaunchActivity extends Activity {
/**
* The payload that is passed as Intent data to NextActivity.
*/
public final static String STRING_PAYLOAD = "Started from LaunchActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launch_next);
Button launchNextButton = (Button) findViewById(R.id.launch_next_activity_button);
launchNextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(NextActivity.makeIntent(LaunchActivity.this, STRING_PAYLOAD));
finish();
}
});
}
}
public class NextActivity extends Activity {
/**
* Extras key for the payload.
*/
public final static String EXTRAS_PAYLOAD_KEY
= "com.example.android.testingfun.lesson4.EXTRAS_PAYLOAD_KEY";
/**
* Factory method to create a launch Intent for this activity.
*/
public static Intent makeIntent(Context context, String payload) {
return new Intent(context, NextActivity.class).putExtra(EXTRAS_PAYLOAD_KEY, payload);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
final String stringPayload = getIntent().getStringExtra(EXTRAS_PAYLOAD_KEY);
if (stringPayload != null) {
((TextView) findViewById(R.id.next_activity_info_text_view)).setText(stringPayload);
}
}
}
ActiviUnitTestCase类提供对于单个Activity进行分离测试的支持。要创建单元测试,我们的测试类应该继承自ActiviUnitTestCase。继承ActiviUnitTestCase的Activity不会被Android自动启动。要单独启动Activity,我们需要显式的调用startActivity()方法,并传递一个Intent来启动我们的目标Activity。
下面是测试类的代码:
public class LaunchActivityTest extends ActivityUnitTestCase<LaunchActivity> {
private Intent mLaunchIntent;
private Button lauchNextButton;
public LaunchActivityTest() {
super(LaunchActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
//获取启动的Intent
mLaunchIntent = new Intent(getInstrumentation().getTargetContext(),LaunchActivity.class);
//启动activity
startActivity(mLaunchIntent, null, null);
//获取控件
lauchNextButton = (Button) getActivity().findViewById(R.id.launch_next_activity_button);
}
@MediumTest
public void testNextActivityWasLaunched_WithIntent(){
lauchNextButton.performClick(); //模拟点击事件
Intent lauchIntent = getStartedActivityIntent(); //获取跳转后的Intent
assertNotNull("Intent was null",lauchIntent); //判断Intent是否为null
assertTrue(isFinishCalled()); //判断跳转后activity是否销毁
//获取Intent携带的数据
String payload = lauchIntent.getStringExtra(NextActivity.EXTRAS_PAYLOAD_KEY);
//判断Intent携带的数据是否正确
assertEquals("Payload is empty", LaunchActivity.STRING_PAYLOAD, payload);
}
}
因为LaunchActivity是独立运行的,所以不可以使用TouchUtils库来操作UI。如果要直接进行Button点击,我们可以调用perfoemClick()方法。
好了大家可以自己写写看了,动手才能发现真正的问题。下篇记录下功能测试。