Java 测试ActivityResult()
我有以下活动:Java 测试ActivityResult(),java,android,testing,junit,instrumentation,Java,Android,Testing,Junit,Instrumentation,我有以下活动: package codeguru.startactivityforresult; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; public class StartActivityFo
package codeguru.startactivityforresult;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class StartActivityForResult extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.startButton = (Button) this.findViewById(R.id.start_button);
this.startButton.setOnClickListener(onStart);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
int result = data.getIntExtra(StartActivityForResult.this.getString(R.string.result), -1);
String msg = "requestCode=" + requestCode + ", resultCode=" + resultCode + ", result=" + result;
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
private View.OnClickListener onStart = new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(StartActivityForResult.this, ChildActivity.class);
StartActivityForResult.this.startActivityForResult(intent, R.id.child_request);
}
};
private Button startButton = null;
}
以及以下JUnit测试:
package codeguru.startactivityforresult;
import android.app.Activity;
import android.app.Instrumentation;
import android.test.ActivityInstrumentationTestCase2;
import android.test.UiThreadTest;
import android.widget.Button;
import junit.framework.Assert;
public class StartActivityForResultTest extends ActivityInstrumentationTestCase2<StartActivityForResult> {
public StartActivityForResultTest() {
super(StartActivityForResult.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
this.setActivityInitialTouchMode(false);
this.activity = this.getActivity();
this.startButton = (Button) this.activity.findViewById(R.id.start_button);
}
@Override
public void tearDown() throws Exception {
this.activity.finish();
super.tearDown();
}
@UiThreadTest
public void testStartButtonOnClick() {
Assert.assertTrue(this.startButton.performClick());
Instrumentation.ActivityResult result = new Instrumentation.ActivityResult(Activity.RESULT_OK, null);
Assert.assertNotNull(result);
Instrumentation.ActivityMonitor am = new Instrumentation.ActivityMonitor(ChildActivity.class.getName(), result, true);
Assert.assertNotNull(am);
Activity childActivity = this.getInstrumentation().waitForMonitorWithTimeout(am, TIME_OUT);
Assert.assertNotNull(childActivity);
Assert.fail("How do I check that StartActivityForResult correctly handles the returned result?");
}
private Activity activity = null;
private Button startButton = null;
private static final int TIME_OUT = 5 * 1000; // 5 seconds
}
package codeguru.startactivityforresult;
导入android.app.Activity;
导入android.app.Instrumentation;
导入android.test.ActivityInstrumentationTestCase2;
导入android.test.UiThreadTest;
导入android.widget.Button;
导入junit.framework.Assert;
公共类StartActivityForResultTest扩展了ActivityInstrumentationTestCase2{
公共StartActivityForResultTest(){
超级(StartActivityForResult.class);
}
@凌驾
public void setUp()引发异常{
super.setUp();
此.setActivityInitialTouchMode(false);
this.activity=this.getActivity();
this.startButton=(按钮)this.activity.findViewById(R.id.start_按钮);
}
@凌驾
public void tearDown()引发异常{
this.activity.finish();
super.tearDown();
}
@超线程测试
public void testStartButtonOnClick(){
Assert.assertTrue(this.startButton.performClick());
Instrumentation.ActivityResult结果=新的Instrumentation.ActivityResult(Activity.result_OK,null);
Assert.assertNotNull(结果);
Instrumentation.ActivityMonitor am=新建Instrumentation.ActivityMonitor(ChildActivity.class.getName(),结果,true);
Assert.assertNotNull(am);
Activity childActivity=this.getInstrumentation().waitForMonitorWithTimeout(am,超时);
Assert.assertNotNull(childActivity);
Assert.fail(“如何检查StartActivityForResult是否正确处理返回的结果?”);
}
私人活动=空;
私有按钮开始按钮=空;
私有静态最终整数时间\u OUT=5*1000;//5秒
}
正如您所看到的,我找到了如何使用
Instrumentation.ActivityResult
和Instrumentation.ActivityMonitor
模拟结果。如何检查StartActivityForResult.onActivityResult()
是否正确处理此结果?请参考以下网站。它将帮助你解决你的问题。
要在测试类中测试ActivityResult(),只需执行以下操作:
public class StartActivityForResult extends Activity {
private boolean activityResultIsReturned = false;
private String activityResult = null;
... ...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
activityResultIsReturned = true;
activityResult = data.getStringExtra("result");
... ...
}
... ...
}
样本StartActivityForResultTest:
public class StartActivityForResultTest extends ActivityInstrumentationTestCase2<StartActivityForResult> {
... ...
public void testOnActivityResult() {
// Get current Activity and check initial status:
StartActivityForResult myActivity = getActivity();
assertFalse(myActivity.getActivityResultIsReturned());
assertNull(myActivity.getActiityResult());
// Mock up an ActivityResult:
Intent returnIntent = new Intent();
returnIntent.putExtra("result", "This is the result");
Instrumentation.ActivityResult activityResult = new Instrumentation.ActivityResult(Activity.RESULT_OK, returnIntent);
// Create an ActivityMonitor that catch ChildActivity and return mock ActivityResult:
Instrumentation.ActivityMonitor activityMonitor = getInstrumentation().addMonitor(ChildActivity.class.getName(), activityResult , true);
// Simulate a button click that start ChildActivity for result:
final Button button = (Button) myActivity.findViewById(com.company.R.id.open_next_activity);
myActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
// click button and open next activity.
button.performClick();
}
});
// Wait for the ActivityMonitor to be hit, Instrumentation will then return the mock ActivityResult:
ChildActivity childActivity = getInstrumentation().waitForMonitorWithTimeout(activityMonitor, 5);
// How do I check that StartActivityForResult correctly handles the returned result?
assertTrue(myActivity.getActivityResultIsReturned());
assertEqual(myActivity.getActiityResult(), "This is the result");
}
... ...
}
公共类StartActivityForResultTest扩展了ActivityInstrumentationTestCase2{
... ...
public void testOnActivityResult(){
//获取当前活动并检查初始状态:
StartActivityForResult myActivity=getActivity();
assertFalse(myActivity.GetActivityResultisReturn());
assertNull(myActivity.getActivityResult());
//模拟ActivityResult:
Intent returnIntent=新Intent();
returnIntent.putExtra(“结果”,“这就是结果”);
Instrumentation.ActivityResult ActivityResult=新的Instrumentation.ActivityResult(Activity.RESULT_OK,returnIntent);
//创建一个ActivityMonitor,用于捕获ChildActivity并返回模拟ActivityResult:
Instrumentation.ActivityMonitor ActivityMonitor=getInstrumentation().addMonitor(ChildActivity.class.getName(),activityResult,true);
//模拟一个按钮单击以启动子活动以获得结果:
最终按钮按钮=(按钮)myActivity.findViewById(com.company.R.id.open\u next\u activity);
myActivity.runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
//单击按钮并打开下一个活动。
button.performClick();
}
});
//等待触发ActivityMonitor,然后检测将返回模拟ActivityResult:
ChildActivity ChildActivity=getInstrumentation().WaitFormMonitorWithTimeout(activityMonitor,5);
//如何检查StartActivityForResult是否正确处理返回的结果?
assertTrue(myActivity.GetActivityResultisReturn());
assertEqual(myActivity.getActivityResult(),“这是结果”);
}
... ...
}
使用意图框架模拟活动结果
intending(hasComponent(DummyActivity.class.getName())).respondWith(new ActivityResult(resultCode, dataIntent));
rule.getActivity().startActivityForResult(new Intent(context,DummyActivity.class));
验证活动结果逻辑正如您从我的代码中看到的,我知道如何在我的
StartActivityForResult
活动中使用onActivityResult()
。我的问题是如何编写JUnit测试以确保其正确运行。感谢您的建议。我在原始帖子中的StartActivityForResult类只是一个例子。在我的实际应用程序中,我有近十几种不同的活动要测试。其中一些活动返回多条数据。您的测试代码表明,为了进行测试,我必须修改每个活动的接口,为子活动返回的每个数据段添加getter。我不介意写这段代码的额外工作。我只是不完全满足于用只用于测试的代码污染生产代码。这些只是演示如何测试onActivityResult()和执行一些基本断言的示例,取决于您的需求,您不需要在所有情况下都更改Activity类,例如,如果您的所有onActivityResult()如果要更新一些UI内容,例如TextView,您可以直接检查更新的文本,而无需添加任何实例变量和getter/setter方法。这是一个很好的观点。我想大多数时候,onActivityResult()
都会以某种方式修改UI,正如您所说。与问题无关,但不需要编写Assert.Assert*(…)
,因为ActivityInstrumentationTestCase2
扩展了junit.framework.Assert
:Assert*(…)
是一种实例方法,而且可以直接呼叫。@Vince是的,我知道这一点。我个人更喜欢这种用法,因为所有的assert*()
方法都是静态的。