2011-08-29 18 views
11

Tôi cần phải kiểm soát thứ tự của các lọ trong cấu hình testRuntime.Làm thế nào để chỉ định thứ tự classpath trong Gradle

Tôi phải đảm bảo rằng robolectric-x.x.jar xuất hiện trước android.jar, nếu không tôi sẽ nhận được RuntimeException đáng sợ ("Stub!").

Tôi làm như thế nào?

+0

Liệu nó nói trong tài liệu rằng jar robolectric có đến trước android .jar trên classpath? –

+1

Có. Từ trang chủ Robolectric: "Khắc phục sự cố java.lang.RuntimeException: Stub! Đảm bảo rằng phụ thuộc vào rô bốt và phụ thuộc của nó xuất hiện trước các API Android API trong đường dẫn lớp." –

+0

Nó hoạt động trong Eclipse, bởi vì người ta có thể kiểm soát rõ ràng thứ tự của classpath đó. Dự án Eclipse được tạo bởi Gradle. –

Trả lời

10

Dưới đây là hoàn chỉnh của tôi build.gradle cho chạy thử nghiệm Robolectric chống lại ứng dụng Android của tôi, trong đó sử dụng RoboGuice:

apply plugin: 'java' 

androidJar = new File(System.getenv('ANDROID_HOME'), '/platforms/android-7/android.jar') 

configurations { robo } 

dependencies { 
    robo('com.pivotallabs:robolectric:1.0-RC1') 
    testCompile('org.roboguice:roboguice:1.1.2') 
    testCompile('junit:junit:4.8.2') 
    testCompile project (':app') 
    testCompile files(androidJar) 
} 

sourceSets.test.compileClasspath = configurations.robo + sourceSets.test.compileClasspath 
sourceSets.test.runtimeClasspath = configurations.robo + sourceSets.test.runtimeClasspath 

test { 
    excludes = ['**/MyRobolectricTestRunner.class'] 
} 

tôi đã có thêm một loại trừ cho người thử nghiệm, hoặc người nào khác Gradle sẽ ném một ngoại lệ.

MyRobolectricTestRunner.java trông như thế này:

package com.acme.myapp; 

import java.io.File; 
import org.junit.runners.model.InitializationError; 
import roboguice.application.RoboApplication; 
import roboguice.inject.ContextScope; 
import com.google.inject.Injector; 
import com.xtremelabs.robolectric.Robolectric; 
import com.xtremelabs.robolectric.RobolectricTestRunner; 

public class MyRobolectricTestRunner extends RobolectricTestRunner { 
    public MyRobolectricTestRunner(Class<?> testClass) throws InitializationError { 
     // Tell Robolectric where to find AndroidManifest.xml and res/ 
     super(testClass, new File("../app")); 
    } 

    /** 
    * Enable injection into tests as well... 
    */ 
    @Override 
    public void prepareTest(Object test) { 
     RoboApplication myApplication = (RoboApplication) Robolectric.application; 
     Injector injector = myApplication.getInjector(); 
     ContextScope contextScope = injector.getInstance(ContextScope.class); 
     contextScope.enter(myApplication); 
     injector.injectMembers(test); 
    } 

} 

Và đây là một thử nghiệm mẫu minh họa tiêm:

package com.acme.myapp; 

import static org.junit.Assert.assertEquals; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import roboguice.inject.InjectResource; 

@RunWith(MyRobolectricTestRunner.class) 
public class StringFormattingTest { 

    @InjectResource(R.string.info_pending_amount) 
    private String pendingAmountPattern; 

    @Test 
    public void testFormatInfoPendingAmount() { 
     String s = String.format(pendingAmountPattern, 20.0d, "EUR"); 
     assertEquals("Only a part of your stake (20,00 EUR) was accepted", s); 
    } 

} 
+0

Bạn tham khảo ứng dụng của bạn như thế nào? thông qua cài đặt của riêng nó. Ứng dụng: cũng phơi bày các phụ thuộc của riêng nó cho các thử nghiệm để tiêu thụ? – Moritz

+0

chúng ta có thể lấy mẫu đơn giản trên github không? – Gary

4

này có thể làm việc:

configurations { robo } 

dependencies { 
    robo ... 
    testRuntime ... 
} 

sourceSets.test.runtimeClasspath = configurations.robo + sourceSets.test.runtimeClasspath 
+0

Tôi phải thêm robo vào compileClasspath cũng như –

+0

@Peter Bạn có biết cách [thay đổi thứ tự của classpath trong trường hợp này] không (http://stackoverflow.com)/question/22863845/how-to-configure-the-order-of-library-in-the-classpath-cho-android-studio) ... – JJD

Các vấn đề liên quan