描述:

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