Quá trình gặp sự cố trong quá trình tạo bộ phun RoboGuice, nếu có phiên bản giả mạo trong bất kỳ mô-đun nào


85

Tôi gặp sự cố khi sử dụng các khuôn khổ RoboGuice và AndroidMock trong thử nghiệm đơn vị. Tôi đã tạo một dự án đơn giản để chỉ ra vấn đề của tôi. Ở đây tôi tạo một phiên bản giả và đăng ký nó trong RoboGuice. Nhưng quá trình bị treo giữa các phương thức "setUp ()" và "test01 ()". Theo tôi đoán, thực sự quá trình bị treo khi Injector được tạo, nếu bất kỳ mô-đun nào có phiên bản giả bên trong.

Nếu tôi thay thế thể hiện bị chế nhạo bằng một thể hiện của một lớp thực thi giao diện thì mọi thứ hoạt động tốt.

Có ai biết cách khắc phục sự cố này không?

Đây là mã thử nghiệm của tôi:

public class testInjectMock extends RoboUnitTestCase<MyApplication> {
    protected void setUp() throws Exception {
        InterfaceToMock instance = AndroidMock.createNiceMock(InterfaceToMock.class);           AndroidMock.expect(instance.SimpleMethod()).andStubReturn("Hello!");            
        MyModule myMockModule = new MyModule();
        myMockModule.setMockedInstance(instance);//Comment this string to get into the test01() method          
        MyApplication.setMyModule(myMockModule);
        super.setUp();
    }
    public void test01() {
        //It never comes here
    }
}

Mã nguồn mô-đun:

public class MyModule extends AbstractAndroidModule {
        protected InterfaceToMock mockedInstance;
        public void setMockedInstance(InterfaceToMock mockedInstance) {
            this.mockedInstance = mockedInstance;
        }
        @Override
        protected void configure() {
            if(mockedInstance != null)
                bind(InterfaceToMock.class).toInstance(mockedInstance);
        }
    }

Đầu ra logcat:

05-23 16:17:07.135: INFO/DEBUG(27): Build fingerprint: 'generic/sdk/generic/:2.1-update1/ECLAIR/35983:eng/test-keys'
05-23 16:17:07.135: INFO/DEBUG(27): pid: 2025, tid: 2031  >>> InjectMock.test <<<
05-23 16:17:07.145: INFO/DEBUG(27): signal 11 (SIGSEGV), fault addr 00000000
05-23 16:17:07.155: INFO/DEBUG(27):  r0 0011b218  r1 43d1caa0  r2 00000000  r3 00000000
05-23 16:17:07.155: INFO/DEBUG(27):  r4 43d1caa0  r5 0011b218  r6 451c0e30  r7 4000a958
05-23 16:17:07.155: INFO/DEBUG(27):  r8 ad00f380  r9 00138de0  10 426bda34  fp 00138de0
05-23 16:17:07.155: INFO/DEBUG(27):  ip 00000002  sp 451c0dc0  lr ad05ad1d  pc ad05a804  cpsr 00000030
05-23 16:17:07.295: INFO/DEBUG(27):          #00  pc 0005a804  /system/lib/libdvm.so
05-23 16:17:07.305: INFO/DEBUG(27):          #01  pc 0005ad18  /system/lib/libdvm.so
05-23 16:17:07.305: INFO/DEBUG(27):          #02  pc 00054a4a  /system/lib/libdvm.so
05-23 16:17:07.315: INFO/DEBUG(27):          #03  pc 00013f58  /system/lib/libdvm.so
05-23 16:17:07.325: INFO/DEBUG(27):          #04  pc 00019888  /system/lib/libdvm.so
05-23 16:17:07.335: INFO/DEBUG(27):          #05  pc 00018d5c  /system/lib/libdvm.so
05-23 16:17:07.335: INFO/DEBUG(27):          #06  pc 0004d6d0  /system/lib/libdvm.so
05-23 16:17:07.345: INFO/DEBUG(27):          #07  pc 0004d702  /system/lib/libdvm.so
05-23 16:17:07.355: INFO/DEBUG(27):          #08  pc 00041c78  /system/lib/libdvm.so
05-23 16:17:07.365: INFO/DEBUG(27):          #09  pc 00010000  /system/lib/libc.so
05-23 16:17:07.365: INFO/DEBUG(27):          #10  pc 0000fad4  /system/lib/libc.so
05-23 16:17:07.375: INFO/DEBUG(27): code around pc:
05-23 16:17:07.385: INFO/DEBUG(27): ad05a7f4 ffff5ae0 fffe57c4 6801b5f8 6a8b1c05 
05-23 16:17:07.385: INFO/DEBUG(27): ad05a804 1c30681e ff5ef7ff 28001c04 6840d018 
05-23 16:17:07.395: INFO/DEBUG(27): ad05a814 d0152800 37101c27 d0112f00 f7ff1c28 
05-23 16:17:07.395: INFO/DEBUG(27): code around lr:
05-23 16:17:07.405: INFO/DEBUG(27): ad05ad0c f7ff1c20 bd10ff7b 6804b510 fd70f7ff 
05-23 16:17:07.405: INFO/DEBUG(27): ad05ad1c 28001c01 f7ffd102 e002f859 f7ff1c20 
05-23 16:17:07.415: INFO/DEBUG(27): ad05ad2c bd10ff6d 4c24b5f0 1c0d1c06 48236a81 
05-23 16:17:07.425: INFO/DEBUG(27): stack:
05-23 16:17:07.425: INFO/DEBUG(27):     451c0d80  43d20870  /dev/ashmem/mspace/dalvik-heap/2 (deleted)
05-23 16:17:07.425: INFO/DEBUG(27):     451c0d84  00000354  
05-23 16:17:07.425: INFO/DEBUG(27):     451c0d88  00000022  
05-23 16:17:07.425: INFO/DEBUG(27):     451c0d8c  ad043693  /system/lib/libdvm.so
05-23 16:17:07.425: INFO/DEBUG(27):     451c0d90  ad07ff50  /system/lib/libdvm.so
05-23 16:17:07.425: INFO/DEBUG(27):     451c0d94  00000024  
05-23 16:17:07.425: INFO/DEBUG(27):     451c0d98  00000354  
05-23 16:17:07.425: INFO/DEBUG(27):     451c0d9c  ad0170ac  /system/lib/libdvm.so
05-23 16:17:07.425: INFO/DEBUG(27):     451c0da0  00000000  
05-23 16:17:07.435: INFO/DEBUG(27):     451c0da4  afe0f2c0  /system/lib/libc.so
05-23 16:17:07.435: INFO/DEBUG(27):     451c0da8  ad080c00  /system/lib/libdvm.so
05-23 16:17:07.435: INFO/DEBUG(27):     451c0dac  00000002  
05-23 16:17:07.435: INFO/DEBUG(27):     451c0db0  00000354  
05-23 16:17:07.445: INFO/DEBUG(27):     451c0db4  43d20870  /dev/ashmem/mspace/dalvik-heap/2 (deleted)
05-23 16:17:07.445: INFO/DEBUG(27):     451c0db8  df002777  
05-23 16:17:07.455: INFO/DEBUG(27):     451c0dbc  e3a070ad  
05-23 16:17:07.455: INFO/DEBUG(27): #00 451c0dc0  00000000  
05-23 16:17:07.455: INFO/DEBUG(27):     451c0dc4  43d1caa0  /dev/ashmem/mspace/dalvik-heap/2 (deleted)
05-23 16:17:07.455: INFO/DEBUG(27):     451c0dc8  451c0e38  
05-23 16:17:07.455: INFO/DEBUG(27):     451c0dcc  451c0e30  
05-23 16:17:07.455: INFO/DEBUG(27):     451c0dd0  4000a958  /dev/ashmem/mspace/dalvik-heap/zygote/0 (deleted)
05-23 16:17:07.455: INFO/DEBUG(27):     451c0dd4  ad05ad1d  /system/lib/libdvm.so
05-23 16:17:07.465: INFO/DEBUG(27): #01 451c0dd8  417a0b5c  /data/dalvik-cache/system@framework@core.jar@classes.dex
05-23 16:17:07.475: INFO/DEBUG(27):     451c0ddc  ad054a4f  /system/lib/libdvm.so

1
Thông tin bổ sung: Có thể tạo kim phun với phiên bản mô phỏng trong bất kỳ mô-đun nào. Tôi đã tạo thành công Injector trong phương thức "test01 ()". Nhưng nếu Injector được tạo bởi RoboUnitTestCase, ứng dụng sẽ bị lỗi.
Andrey

16
Nguồn RoboUnitTestCase code.google.com/p/roboguice/source/browse/roboguice/src/main/... nói "Hãy chắc chắn rằng bạn sử dụng một trong những @ * chú thích thử nghiệm và bắt đầu tên của testcase của bạn với 'test'" nhưng Setup không được chú thích @Beforevà thử nghiệm của bạn không được chú thích @Test...
Paul D'Ambra

2
Có vẻ như nó không trực tiếp là một vấn đề java ( signal 11 (SIGSEGV), fault addr 0000000). Bạn có thể thử với một phiên bản phần sụn khác (trình giả lập hoặc thiết bị) không?
Pierre-Henri

Bạn có thể cung cấp cho chúng tôi định nghĩa về giao diện InterfaceToMock, để chúng tôi có thể tái tạo hành vi chính xác của AndroidMock.createNiceMock.
Remco

Nếu một trong những điểm A tốt cho bạn, bạn có thể chấp nhận nó không? Q vẫn đang mở.
Glen Best

Câu trả lời:


5

Thật không may, nếu có vấn đề với các bước thiết lập cho RoboGuice và kiểm tra đơn vị, bạn có thể gặp phải lỗi này. Không có câu trả lời ngắn gọn thần kỳ nào, mà là một tập hợp các bước để làm theo chính xác.

BTW, bạn đang sử dụng RoboGuice 1.1 - AbstractAndroidModule & RoboUnitTest không còn tồn tại trong RoboGuice 2.0. RoboGuice 1.1 không được dùng nữa, vì vậy giải pháp tổng thể tốt nhất là chuyển sang phiên bản mới nhất theo các hướng dẫn này Nâng cấp lên 2.0 .

Tuy nhiên, trong trường hợp bạn đã gắn với RoboGuice 1.1, đây là một số bước để làm theo:

  • Không có mã / tệp xây dựng được tạo không nhất quán sau khi tái cấu trúc / thay đổi tên gói, v.v. Xóa mã đã tạo, thực hiện Dọn dẹp & Xây dựng, thậm chí tạo lại một dự án mới và sao chép tệp nguồn vào.
  • Có mã ứng dụng của bạn trong một dự án (phụ thuộc vào RoboGuice, độc lập với Instrumentation / RoboUnitTestCase / AndroidMock). Dự án mã ứng dụng của bạn có trong lib: guice-2.0-no_aop.jar và roboguice-1.1.2.jar.
  • Có mã kiểm tra đơn vị của bạn trong một dự án khác tham chiếu đến nó (độc lập với RoboGuice, độc lập với Instrumentation / RoboUnitTestCase / AndroidMock). Hướng dẫn ở đây trước khi bạn bắt đầu . Dự án mã thử nghiệm của bạn có trong lib: AndroidMockGenerator.jar.
  • Trong dự án ứng dụng của bạn, các lớp Mô-đun + Ứng dụng của bạn trông giống như sau:

    package com.mypackage;
    
    import android.app.Instrumentation;
    import android.content.Context;
    
    public class MyApplication extends roboguice.application.RoboApplication {
    
    static MyModule myModule;    
    
    // this constructor usually called by app
    public MyApplication(Context context) {
        super();
        attachBaseContext(context);
    }
    // This constructor called by unit tests.  This is unfortunately small amount of 
    // 'abstraction leakage' of unit test needs into app code.
    public MyApplication(Instrumentation instrumentation) {
        super();
        attachBaseContext(instrumentation.getContext());
    }    
    public static void setModule(MyModule module) {
        MyApplication.myModule = module;
    }   
    public static MyModule getModule() {
        return MyApplication.myModule;
    }   
    }
    

    package com.mypackage;
    
    public class MyModule extends roboguice.config.AbstractAndroidModule {
    // this will be injected
    protected UsefulObject myUsefulInstance;    
    
    public void setUsefulObject(UsefulObject usefulInstance) {
        this.myUsefulInstance = usefulInstance;
    }    
    public UsefulObject getUsefulObject() {
        return this.myUsefulInstance;
    }    
    
    @Override
    protected void configure() {
        bind(UsefulObject.class).toInstance(myUsefulInstance);
    }
    

    }

  • Trong dự án thử nghiệm của bạn, lớp trường hợp thử nghiệm của bạn trông giống như sau:

    import android.test.suitebuilder.annotation.LargeTest;    
    import com.mypackage.MyApplication;    
    import com.mypackage.MyModule;    
    import com.mypackage.UsefulObject;    
     //import com.mypackage.UsefulObjectSimpleImplementation;    
    import android.test.suitebuilder.annotation.MediumTest;    
    import android.test.suitebuilder.annotation.SmallTest;    
    import com.google.android.testing.mocking.AndroidMock;    
    import roboguice.test.RoboUnitTestCase;
    
    public class TestMyModule extends RoboUnitTestCase<MyApplication> {
    
    @Override
    protected void setUp() throws Exception {
        UsefulObject instance = // new UsefulObjectSimpleImplementation(); 
                                AndroidMock.createNiceMock(UsefulObject.class);           
        MyModule mockModule = new MyModule();
        mockModule.setUsefulObject(instance);
        MyApplication.setModule(mockModule);
        super.setUp();
    }
    
    // Make sure you use one of the @*Test annotations AND begin
    // your testcase's name with "test"
    @MediumTest
    public void test01() {
        AndroidMock.expect(MyApplication.getModule().getUsefulObject().
             simpleMethod()).andStubReturn("Hello!");
    }
    

    }

  • Đảm bảo rằng đối với dự án thử nghiệm, tệp AndroidManifest.xml có mục nhập sau:

   <instrumentation android:name="android.test.InstrumentationTestRunner"
     android:targetPackage="com.mypackage"
     android:label="Tests for com.mypackage"/>
  • Trước khi chạy thử nghiệm, hãy đảm bảo rằng trình mô phỏng của bạn đã được khởi động và đang hoạt động lành mạnh, bằng cách chạy ứng dụng "Hello World" khác, đơn giản trước. Khi điều này thành công, sau đó chạy ứng dụng của bạn. Cuối cùng, chạy dự án thử nghiệm của bạn.

Nên làm việc sau này. Chúc may mắn & hãy cho tôi biết!


0

Thật không may, đây là một lỗi trong chính Android. Xem báo cáo lỗi tại đây . Máy ảo gặp sự cố khi cố gắng tìm kiếm chú thích trên Proxy , đây là những gì AndroidMock sử dụng khi chế nhạo một giao diện .

Cách giải quyết là tạo một lớp thực thi giao diện, như bạn đã chỉ ra trong câu hỏi của mình. Bạn có thể thử tạo một lớp trừu tượng thuần túy triển khai giao diện mà không cần triển khai bất kỳ phương thức nào, sau đó sử dụng AndroidMock để mô phỏng lớp đó thay vì giao diện. Điều này sẽ tránh việc tạo Proxy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.