2011-08-05 16 views
5

Android Testing içeriklerine yeniyim. Bir düğmeyi tıklatmanız ilgili bir etkinliğin açılıp açılmayacağını test etmek isterim. Biraz araştırma yaptım ve kontrolü yapmak için ActivityManager kullanmam gerekeceğini öğrendim.Button.perform Nasıl çağırılır Android JUnit test vakasında?

Sorun şu ki, "tıklayarak" parçasını çalışamıyorum. Button.performClick()'u kullanmaya çalışıyorum.

Öncelikle bu işlevi çağırdım ve bunu geçerli iş parçacığında yapamayacağımı söyleyen bir hata aldım. Bazı kullanıcılardan sonra, UI dizisinde aramam gerektiğini ve runOnUiThread(Runnable r) method numaralı telefondan geldiğini öğrendim.

Tıklamaya çalıştığım düğme _helloButton_. Bu _setUp()_ method'da elde edilir. Orada olduğundan emin olmak için _assertNotNull_'u kontrol ettim. Bir test yöntemi içinde

, ben
mActivity.runOnUiThread(new Runnable() { 
     public void run() { 
      helloButton.requestFocus(); 
     } 
    }); 
helloButton.performClick(); 

arayıp requestFocus() çağıran çizgisinde bir NPE olsun.

Sonraki Ben

mActivity.runOnUiThread(new Runnable() { 
     public void run() { 
      helloButton.performClick(); 
     } 
    }); 

çalıştı ve hala aynı boş işaretçi istisna olsun. JUnit perspektifi üzerinde

, bu mesaj

Test failed to run to completion. Reason: 'Instrumentation run failed due to 'java.lang.NullPointerException''. Check device logcat for details 

olsun Ve stackTrace buna benziyor. Ben helloButton.performClick() arıyorum nereye

08-05 19:03:11.922: ERROR/AndroidRuntime(578): Uncaught handler: thread main exiting due to uncaught exception 
08-05 19:03:11.922: ERROR/AndroidRuntime(578): java.lang.NullPointerException 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at com.example.helloworldmk2.test.HelloWorldMK2Test$1.run(HelloWorldMK2Test.java:57) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at android.os.Handler.handleCallback(Handler.java:587) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at android.os.Handler.dispatchMessage(Handler.java:92) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at android.os.Looper.loop(Looper.java:123) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at dalvik.system.NativeStart.main(Native Method) 

Hat 57 olduğunu.

NPE aldığımdan emin değilim; assertNotNull sorunsuz geçer. Bu konuda bana yardımcı olabilirseniz, gerçekten takdir ediyorum. Şimdiden teşekkürler.

DÜZENLEME: Bu özel test sınıfı için alt sınıf ActivityInstrumentationTestCase2 kullanıyorum.

DÜZEN 2: Logcat, NPE oluşmadan önce bazı hataları uyarır. 08:

Ben

08-05 20 bkz 54,702: HATA/AndroidRuntime (754): HATA: 08:: 58.642: iplik

ve

08-05 20 başarısız bağlayabilecektir HATA/gralloc (52): [kayıt dışı] 0x3e1b28 işlemek için hala kilitli (durum = 40000001)

+0

açık bilgi için, yeni bir faaliyetin başlatılmasını tetikleyecektir bir düğmeye basarak istediğiniz gibi aşağıda runTestOnUiThread() yöntemini kullanabilir? –

+0

evet. Düğmede, başka bir etkinliği başlatan bir onClickListener vardır. –

cevap

15

Sen UI iş parçacığı üzerinde çalıştırmak için sınama açıklama yapabilirsiniz:

@UiThreadTest 
public void testNoErrorInCapitalization() { 
    final String msg = "this is a sample"; 
    mMessage.setText(msg); 
    mCapitalize.performClick(); 
    final String actual = mMessage.getText().toString(); 
    final String notExpectedRegexp = "(?i:ERROR)"; 
    assertNotContainsRegex("Capitalization found error:", 
     notExpectedRegexp, actual); 
} 

Bu, Android Application Testing Guide'dan alınan bir örnektir.

+0

Sadece günümü kurtardın efendim. Teşekkür ederim! –

-1

Basit bir soruna çok zor bir yaklaşımla yaklaşıyorsunuz ...esasen bu gibi yapılandırılmış kod DİKKAT gerek bu sudo kodudur ve

public void myOnClickListener(View source) { 

    switch source.getId() { 
    case R.id.Your_Button_Name_In_Xml : 
    Intent MyNewActivity = new Intent(this, MyNewClass.class); 
    startActivity(MyNewActivity); 
    } 
} 

çek ÇALIŞMAYACAKTIR bunu http://learnandroid.blogspot.com/2008/01/opening-new-screen-in-android.html

+0

Bu yöntemin nasıl çalıştığını biliyorum, ancak burada yapmam gereken şey bu değil. Bu bir JUnit test vakasıdır; Tüm buton tıklama dinleyicileri zaten tanımlanmıştır. Test durumu yönteminde tıklamanız yeterlidir. –

0

Ayrıca

public void testHelloButton() throws Throwable{ 
     runTestOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       helloButton.performClick(); 
      } 
     }); 

    }