描述:
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(); }