6

Tôi đã nhìn vào mã ví dụ astroboy và tài liệu cho RoboGuice 2, và tôi thành thật stumped. Tôi hy vọng tất cả các bạn có thể giúp tôi với những điều cần thử. Mục tiêu ở đây là kiểm tra mô-đun để đảm bảo rằng nó đang tải và IoC đang hoạt động/kết nối.cố gắng để kiểm tra đơn vị và một cái gì đó với RoboGuice.newDefaultRoboModule() là không với Roboguice 2.0b3 và Robolectric

Tôi có một bài kiểm tra đó cũng tương tự như ví dụ của họ: http://code.google.com/p/roboguice/source/browse/astroboy/src/test/java/org/roboguice/astroboy/controller/Astroboy2Test.java?name=roboguice-2.0b3&r=ba37ef680410c64f7f1fe90f5b7b482958d276b5

Mine là khác nhau trong hai cách ... mô-đun của tôi là trong một lớp học thư viện, đó là giống hệt nhau bởi cú pháp:

public class MyTestModule extends AbstractModule { 
     @Override 
     protected void configure() { 
      bind(Vibrator.class).toInstance(vibratorMock); 
     } 
} 

tôi cũng có roboguice.xml trong lớp thư viện trong thư mục giá trị

<resources> 
    <string-array name=roboguice_modules> 
     <item>com.yourdomain.MyTestModule</item> 
    </string-array> 
<resources> 

dự án thử nghiệm tham chiếu dự án ứng dụng, whic h tham chiếu và xuất khẩu dự án thư viện.

Trong dự án thử nghiệm nó giống như vậy:

@RunWith(RobolectricTestRunner.class) 
public class MyTest { 

    @Before 
    public void setup() { 
    // Override the default RoboGuice module 
    RoboGuice.setBaseApplicationInjector(Robolectric.application, RoboGuice.DEFAULT_STAGE, Modules.override(RoboGuice.newDefaultRoboModule(Robolectric.application)).with(new MyTestModule())); 
} 

Trong việc thiết lập, nó luôn luôn lỗi với một số loại ngoại lệ null. Tôi đã phá vỡ này ra, và đặc biệt với phương pháp mớiDefaultRoboModule. Tôi biết rằng Robolectric.application không phải là null, và tôi biết rằng MyTestModule mới cũng không phải là null. Mặc dù khi bước qua trình gỡ lỗi, tôi thấy rằng MyTestModule.binder là null, vì vậy tôi không biết đó có phải là một vấn đề hay không.

lỗi stack trace:

java.lang.NoClassDefFoundError: javax/inject/Provider 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClassCond(Unknown Source) 
at java.lang.ClassLoader.defineClass(Unknown Source) 
at java.lang.ClassLoader.defineClass(Unknown Source) 
at javassist.Loader.findClass(Loader.java:379) 
at com.xtremelabs.robolectric.bytecode.RobolectricClassLoader.findClass(RobolectricClassLoader.java:72) 
at javassist.Loader.loadClass(Loader.java:311) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at com.xtremelabs.robolectric.bytecode.RobolectricClassLoader.loadClass(RobolectricClassLoader.java:49) 
at roboguice.RoboGuice.newDefaultRoboModule(RoboGuice.java:144) 
at test.yourdomain.MyTest.setup(MyTest.java:45) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) 
at com.xtremelabs.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:284) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: java.lang.ClassNotFoundException: javax.inject.Provider 
at java.net.URLClassLoader$1.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at javassist.Loader.delegateToParent(Loader.java:428) 
at javassist.Loader.loadClassByDelegation(Loader.java:406) 
at javassist.Loader.loadClass(Loader.java:308) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at com.xtremelabs.robolectric.bytecode.RobolectricClassLoader.loadClass(RobolectricClassLoader.java:49) 
... 36 more 

tôi nên tìm kiếm ở đâu khác? Tôi cảm thấy mất đi cách tất cả điều này liên kết thông qua thử nghiệm.

Cám ơn tìm, Kelly

+0

Vì vậy, vấn đề tồn tại với việc tiêm Nhà cung cấp, đó là lớp học guice 3.0. Điều này có nghĩa là tôi cần phải tiêm một nhà cung cấp? Tôi nghĩ rằng roboguice đã được kết nối với tất cả những thứ này. Bạn làm gì với RoboGuice 2 và kiểm tra đơn vị? – KellyTheDev

+0

Cập nhật nhỏ. sự buồn bã: Tôi chưa bao giờ có thể nhận được roboguice 2 làm việc. Và sau rất nhiều lần quay trở lại, tôi bị thương khi hạ cấp xuống sử dụng roboguice 1.1.2 và không có phép thuật. Tôi ước rằng sẽ có nhiều hỗ trợ hơn ở mặt trận này, nhưng ít nhất các bài kiểm tra đơn vị đang chạy. Khi nhìn lại và những gì tôi phải làm bây giờ, tôi đoán tôi sẽ phải tiêm nhà cung cấp vào thời điểm thử nghiệm vào ứng dụng, nhưng tôi không biết. Tôi vẫn muốn biết làm thế nào để sử dụng ở trên nếu có ai có ý tưởng. Nếu bất cứ ai muốn tôi chia sẻ những gì tôi đã làm cho roboguice 1.1.2 và android tôi cũng hạnh phúc hơn nữa. Liên lạc tôi. – KellyTheDev

+0

Bạn đã bao giờ xem ứng dụng mẫu được cung cấp roboguice và cách nó được thiết lập. Đó là tất cả .. –

Trả lời

9

Tôi cần bao gồm tệp javax.inject.jar từ guice 3.0 zip với thiết lập roboguice 2.0 của mình.

https://github.com/google/guice/wiki/Guice30

+1

oooooh! Cám ơn vì sự gợi ý. Tôi sẽ thử điều này và cho bạn biết. Nếu đây là tất cả, thì [this is] tổng số tuyệt vời @Soulreaper. – KellyTheDev

+1

Cuối cùng, tôi đã có thể trải qua điều này và kiểm tra nó. Cảm ơn bạn một lần nữa @Moritz! Bạn đang đề xuất đã làm các trick độc đáo. (Tôi xin lỗi vì đã mất quá nhiều thời gian để tôi quay lại điều này) – KellyTheDev

+1

Điều đó thực sự mất một thời gian dài ** g ** – Moritz

0

Dự án Roboguice có một bài kiểm tra robolectric trong ứng dụng mẫu. Kiểm tra nó ra in the source. Tôi đang sử dụng cùng một cách tiếp cận và nó hoạt động tốt cho tôi.

Tôi chắc chắn sẽ đề xuất nâng cấp lên phiên bản 2.x của Roboguice sớm. Mới nhất với bản phát hành ..