描述:
button 是一般的 android 預設的 button,xml 定義如下
<Button
android:id="@+id/showtime_btn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:text="Show Time" />
被測程式 source code 使用如下
public class MainActivity extends Activity implements OnClickListener
{
private Button mShowTimeButton;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initUIComponents();
}
private void initUIComponents()
{
mShowTimeButton = (Button) findViewById(R.id.showtime_btn);
mShowTimeButton.setOnClickListener(this);
}
@Override
public void onClick(View view)
{
int uiId = view.getId();
switch(uiId){
case R.id.showtime_btn:
System.out.println("click show time button");
break;
}
}
}
在直接執行被測程式的情況下, mShowTimeButton 可以點擊且點擊會出現click show time button。
測試程式如下
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity>
{
private static final String DEBUG = MainActivityTest.class.getSimpleName();
private MainActivity mMainActivity;
private Button mShowTimeButton;
public MainActivityTest() {
super("com.example.targettestproject", MainActivity.class);
}
protected void setUp() throws Exception
{
super.setUp();
setActivityInitialTouchMode(true);
mMainActivity = getActivity();
initUIComponents();
}
private void initUIComponents()
{
mShowTimeButton = (Button) mMainActivity.findViewById(R.id.showtime_btn);
}
protected void tearDown() throws Exception
{
super.tearDown();
}
public void testPrecondition()
{
assertNotNull(mMainActivity);
assertNotNull(mShowTimeButton);
}
@UiThreadTest
public void testShowTimeByClickButton()
{
TouchUtils.clickView(this, mShowTimeButton);
}
}
第15行經過測試有沒有加入 setActivityInitialTouchMode 沒有影響。
第37行經過測試有沒有加入 @UiThreadTest 沒有影響。
第40行沒有效果。
經過 google 相關搜尋沒有找到類似的問題及解決方案。
修正:
使用 @UiThreadTest 以及 Button.performClick() 來取代 TouchUtils.clickView,如下
...
@UiThreadTest
public void testShowTimeByClickButton()
{
mShowTimeButton.performClick();
}