2015-03-17 19 views
10

Android Studio'ya yeni geliyorum. Ben Android Studio 1.2 önizleme 2, gradle 2.2.1 ve gradle eklentisi 1.1.0 kullanıyorum. Benim build.gradle olarakAndroid Studio'da birim testi: "alay edilmemiş" hatası

public class AppPreferencesTest extends InstrumentationTestCase { 

AppPreferences preferences; 

@Before 
public void setUp() throws Exception { 
    preferences = new AppPreferences(getInstrumentation().getTargetContext()); 
} 

... 

:

testCompile 'junit:junit:4.12' 
Bu benim test sınıftır

java.lang.RuntimeException: Method getInstrumentation in android.test.InstrumentationTestCase not mocked 

: my birim testler çalışırken

Ben, bu sorundan alamayan

Bu

ekleyerek çalıştı ben http://tools.android.com/tech-docs/unit-testing-support izlenen adımlar sözü edilen ama bunu düzeltmek olmadığından

.

Ben de bir MockContext oluşturma çalıştı: Bir hatayı

public AppPreferences(Context context) { 
    preferences = PreferenceManager.getDefaultSharedPreferences(
      context); 
} 

...

RuntimeException: Method getDefaultSharedPreferences in android.preference.PreferenceManager not mocked. 

cevap

3

Ben Android Studio kullanarak, işe Enstrümantasyon testleri alamadım, ben hala uygulanmasını sonuçlandırılması ediyoruz sanırım. Emülatörde çalışması gerektiğinden, daha hızlı seçenekler vardır: düzenli birim testleri.

Jared'in önerileri sayesinde, Android Studio'da kullanımı kolay olan Robolectric'e geçtim.

androidTestCompile 'junit:junit:4.12' 
androidTestCompile "org.robolectric:robolectric:3.0" 

ve

burada bilgi şu anda doğru gibi görünüyor

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.robolectric.RuntimeEnvironment; 
import org.robolectric.RobolectricTestRunner; 
import static junit.framework.TestCase.assertEquals; 

@RunWith(RobolectricTestRunner.class) 
public class AppPreferencesTest { 

    AppPreferences preferences; 

    @Before 
    public void setUp() throws Exception { 
     preferences = new AppPreferences(RuntimeEnvironment.application.getApplicationContext()); 
    } 

    @Test 
    public void testIsNotificationsEnabled_Default() throws Exception { 
     assertEquals(true, preferences.isNotificationsEnabled()); 
    } 

    ... 
: http://nenick-android.blogspot.nl/2015/02/android-studio-110-beta-4-and.html Ama muhtemelen yakın gelecekte tekrar kullanımdan kaldırmak olacak, tüm bilgi olarak kullanıyorum bu konuda bulundu google zaten kullanımdan kaldırıldı.

+11

"Jared'in önerileri sayesinde". Yine de kendinize kredi verdiniz. –

+0

RobolectricTestRunner neden MockitoJunitRunner'den daha iyi? –

+0

Tüm Android'e özgü sınıfları, bağlamlar gibi kolayca alay ediyor. – Frank

9

Size haber görüyorum verir daha

preferences = new AppPreferences(new MockContext()); 

ama AppPreferences yapıcısı senin soru. https://github.com/applicake/Beandroid/blob/master/Beanstalk%20Android%20ClientTest/src/com/applicake/beanstalkclient/test/SharedPreferencesMockContext.java:

bu SharedPreferencesMockContext.java kaynağına bir göz atın.

@Override 
    protected void setUp() throws Exception { 

    final SharedPreferencesMockContext mockContext = new SharedPreferencesMockContext(getContext()); 
    MockApplication mockApplication = new MockApplication(){ 
     @Override 
     public Context getApplicationContext() { 
     Log.d("tests", "Im here"); 
     return mockContext; 
     } 
    }; 


    context = mockContext; 
    setApplication(mockApplication); 
    prefs = PreferenceManager.getDefaultSharedPreferences(context); 
    prefs.edit().clear().commit(); 

    super.setUp(); 
    } 

dün gece bu hataya koştu: İşte https://github.com/applicake/Beandroid/blob/master/Beanstalk%20Android%20ClientTest/src/com/applicake/beanstalkclient/test/NotificationsTests.java

onların Mock oluşturulan nasıl bir pasajı gösterisi: Burada

testtir. " MockContext" kullanmayı deneyin.

public class AppPreferencesTest extends InstrumentationTestCase { 

AppPreferences preferences; 
Context context; 

@Before 
public void setUp() throws Exception { 
    context = new MockContext(); 
    preferences = new AppPreferences(context); 
} 

burada diğer örneklere bakın: https://stackoverflow.com/a/29063736/950427

+0

Thanx, Bunu daha önce denedim, ancak AppPreferences yapıcısı içinde başka bir hata verecek, bunu soruma ekledim. – Frank

+1

@Frank Cevabımı güncelledim. –

+0

Ancak bu bir emitöre ihtiyaç duyan bir AndroidTestCase olan ServiceTestCase'tir. Ve bir ServiceTestCase veya bunun gibi bir şey olması gerekir, çünkü snippet'inizin başlangıcında getContext() öğesini kullanır (bunun için SharedPreferencesMockContext, sadece ileriye doğru). – Frank