18

Kodumuzu Gradle 2.2 ve Android Studio 1.0'a yükseltmek için çalışıyorum. Şu anda, Robolectric 2.4 çalışmasını almaya çalışıyorum, ancak Birim Testlerini çalıştırmayı denediğimde garip bir sorun yaşıyorum. Sorun, yalnızca bir gradle clean; Test paketini birden çok kez çalıştırmak, geçen testleri (beklendiği gibi) üretecektir. Ben Robolectric gradle eklenti kullanmak ister ben bu hatayıClassCastException: NoClassDefFoundError RuntimeException için dönüştürülemiyor

Activity activity = Robolectric.setupActivity(MainActivity.class); 

: Bu çağrıya geri hatayı takip var

java.lang.ClassCastException: java.lang.NoClassDefFoundError cannot be cast to java.lang.RuntimeException 

: Temiz bir sonra testleri çalıştırdığınızda, aşağıdaki hatayı alıyorum (org.robolectric:robolectric-gradle-plugin:0.14.0) veya JC ve K Android ünite test eklentisi (com.github.jcandksolutions.gradle:android-unit-test:2.1.1).

Ben Robolectric Github başvurulan bu sorunu buldum, ama henüz ele alınmış gibi gözükmüyor: https://github.com/robolectric/robolectric/issues/1385

Bu sorun, android stüdyo birim test eklentisinde başvuruda bulunulan, 'Sorun Çekim altında ': https://github.com/evant/android-studio-unit-test-plugin

Bulunduğum örnek kod burada: Ben seein olmadan Robolectric örnekler üzerinde api-android-16 projeyi çalıştırmak mümkün olmuştur https://github.com/KioKrofovitch/robolectric-upgrade-test

Bu sorun, api-android-19 ve api-android-21 projeleri diğer nedenlerle başarısız olsa da. Ne yaptıklarını farklı bir şekilde göremiyorum ki, bu başarısızlığı alamıyorlar. https://github.com/robolectric/robolectric-samples

Bunun için geçici bir çözüm bulunmuş mu? Testleri iki kez çalıştırmak Jenkins veya Travis gibi CI araçları için iyi bir çözüm değildir.

DÜZENLEME: katıştırma kod örnekleri JC ve K Birimi Test kütüphanesi eklemek

Benim üst düzey build.gradle:

buildscript { 
    repositories { 
     mavenCentral() 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:1.0.0' 
     classpath 'com.github.jcandksolutions.gradle:android-unit-test:2.1.1' 

     // NOTE: Do not place your application dependencies here; they belong 
     // in the individual module build.gradle files 
    } 
} 

allprojects { 
    repositories { 
     jcenter() 
    } 
} 

ben robolectric eklemek Projem seviyesi build.gradle:

apply plugin: 'com.android.application' 

repositories { 
    mavenCentral() 
} 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "com.example.robolectrictest" 
     minSdkVersion 15 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    sourceSets { 
     main { 
      jniLibs.srcDirs = ['libs'] 
     } 

     androidTest { 
      setRoot('src/androidTest') 
     } 
    } 
} 

// Must be after Android plugin 
apply plugin: 'android-unit-test' 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:21.0.3' 

    //androidTestCompile 'junit:junit:4.10' 
    //androidTestCompile 'org.robolectric:robolectric:2.4' 

    // Testing frameworks 
    testCompile 'junit:junit:4.10' 
    testCompile 'org.robolectric:robolectric:2.4' 
} 

şablon bunu yaratan olarak benim çok temel Etkinlik, her şey bırakılmıştır:

Nedeniyle setupActivity() yöntemi hata benim assert alamıyorum
public class MainActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

Benim kukla testi:

@Config(emulateSdk = 18) 
@RunWith(RobolectricTestRunner.class) 

public class ApplicationTest { 

    @org.junit.Test 
    public void testDummy() throws Exception { 

     Activity activity = Robolectric.setupActivity(MainActivity.class); 

     assertTrue(true); 
    } 

} 

DÜZENLEME # 2: Ben aşağıdaki komutları çağırmak testlerini çalıştırmak için Projemin en üst düzeydeki dizini:

./gradlew clean 
./gradlew test 

Ben de gradle sarmalayıcı dışında testler çalıştı ve aynı sonuçları elde var

gradle clean 
gradle test 
+1

İlgili kodu gerçekten bu soruya yapıştırabilir misiniz? Github projenizden hangi dosyalara bakmam gerektiğini bilmiyorum. –

+0

Elbette, teşekkürler! En alakalı kod snippet'lerini –

+0

Doğru ekledim. Kesinlikle bir not sorunu, ve korkarım kürsü hakkında çok az şey biliyorum, bu yüzden size yardımcı olma yeteneğimin ötesinde. Yine de yaptığım şey, sorudaki android etiketinin not etiketinin yerini tutmasıdır, bazı uzman uzmanların da gelip sorunuzu bulmasını umarız. Üzgünüm daha fazla yardım edemedim. –

cevap

13

Bu, Robolectric 2.4 (Yayın No. 1385) ile ilgili bir sorun olarak onaylandı.sorun aşağıdaki yorum ile bugün Erich Douglass'a tarafından kapatıldıktan: Bir kez

./gradlew clean 
./gradlew assemble 
./gradlew test 

: 3.0 serbest bırakılana kadar

We are working on appcompat support for 3.0. Until then, there's not much you can do.

https://github.com/robolectric/robolectric/issues/1385

Yani, aşağıdaki geçici çözümü kullanıyor olacak Assemble koştu, görünüşe göre Robolectric ihtiyaç duyduğu tüm öğeleri yarattı. Daha sonra testlerinizi başarılı bir şekilde yürütebilirsiniz. Bu çözüm, hem yerel olarak hem de Travis veya Jenkins gibi bir CI aracında uygulanabildiğinden, ./gradlew build veya ./gradlew test'u iki kez çalıştırmaktan daha iyidir. Jenkins birden Gradle görevleri çalıştırmak için sözdizimi her görevin arasında tek boşluk bırakıyor:

assemble test 
+0

Başka bir geçici çözüm var mı? Bu benim için çalışmıyor. –

0

Sorunum çözüldü. Robolectirc'i 2.4'e ve min SDK'ya 19'a ve android desteğini com.android.support:support-v13:19.1.0'a güncelledim. Ve aynı zamanda iml dosyalarında değişiklikler yaptı. Kişisel rehberlik ve tepki

Venkatraman

İlgili konular