2016-05-13 16 views
6

Tôi đang sử dụng xe buýt sự kiện của Otto trong đơn đăng ký của tôi. Trong một trong các lớp học của tôi, tôi đăng sự kiện này.Làm thế nào để đơn vị phương pháp thử được đăng bởi Event Bus trong android?

MyEvent myevent = new MyEvent(); 
uiBus.post(myEvent); 

Tôi có thể kiểm tra phương pháp đăng bài.

Bây giờ có một lớp khác đang nhận sự kiện.

//ReceiverClass.java 
@Subscribe 
public void onEventReceived(MyEvent myevent) { 
    callAMethod(); 
} 

Làm cách nào để tôi kiểm tra đơn vị rằng phương thức này đã được gọi. Tôi đã thử với mã kiểm tra sau đây

@Mock 
Bus uiBus; 

@Test 
public void testBusReceviedEvent() { 
    ReceiverClass instance = new ReceiverClass(); 
    mockBus.register(instance); 
    MyEvent myevent = new MyEvent(); 
    mockBus.post(myEvent); 
    //Test 
    verify(instance, times(1)).callAMethod(); 
} 

Nhưng mã này không hoạt động.

+0

mockBus là gì? –

Trả lời

0

Nó không hoạt động vì instance không phải là mô hình. Bạn sẽ phải xác minh các hiệu ứng của callAMethod hoặc đặt phương thức đó vào một lớp khác và chèn một mô hình của lớp mới này vào lớp ReceiverClass của bạn.

Ví dụ ...

private class ReceiverClass { 
    private MyNewClass theNewClassIWasTalkingAbout; 

    // Stick in a setter for that^

    @Subscribe 
    public void onEventReceived(MyEvent myevent) { 
     theNewClassIWasTalkingAbout.callAMethod(); 
    } 
} 

Sau đó thử nghiệm của bạn sẽ phải thay đổi một chút ...

@Mock 
private MyNewClass mockNewClass; 

@InjectMocks // This will be the "solid" implementation of the thing you are trying to test, it is not a mock... 
private ReceiverClass instance; 

@Test 
public void testBusReceivedEvent() { 
    mockBus.register(instance); 
    MyEvent myevent = new MyEvent(); 

    mockBus.post(myevent); 

    verify(mockNewClass, times(1)).callAMethod(); 
} 

Hope this helps.

1

Tôi trễ một chút với bữa tiệc nhưng đây là ví dụ về lớp học hoạt động và tài khoản cho các cuộc gọi không đồng bộ. Thay vì Mocking EventBus, chúng tôi chỉ đơn giản để cho nó làm điều đó và đăng ký nó trong lớp TestDriver dưới đây.

Điều làm cho tác phẩm này là CountDownLatch, với sự giúp đỡ của lớp trừu tượng DataTransferCallback, đợi latch.countDown() được gọi hoặc 5 giây để đi qua.

Chỉ cần đăng ký lớp thử nghiệm của bạn và trong phương pháp @Subscribe, chuyển nó trở lại phương thức tạo DataTransferCallback và thực hiện xác nhận của bạn ở đó.

@RunWith(AndroidJUnit4.class) 
public class TestDriver { 

    private final CountDownLatch latch = new CountDownLatch(1); 
    private EventBus eventBus; 

    private DataTransferCallback transferCallback; 

    public abstract class DataTransferCallback { 
     abstract void onSuccess(DataTransfer event); 
    } 

    @Before 
    public void setUp() { 
     EventBus.getDefault().register(this); 
     eventBus = spy(EventBus.getDefault()); 
    } 


    @SuppressWarnings("unchecked") 
    @Test 
    public void test200Resposne() throws InterruptedException { 
    // Get known good JSON 
    final String json = TestJSON.get200Response(); 
    // Class under test 
    final Driver driver = new Driver(InstrumentationRegistry.getTargetContext()); 
    final JsonParser jsonParser = new JsonParser(); 
    //boolean to hold our test result 
    final boolean[] testPassed = new boolean[]{false}; 

    transferCallback = new DataTransferCallback() { 

     @Override 
     public void onSuccess(DataTransfer event) { 
      assertNotNull(event); 
      verify(eventBus).post(event); 
      assertThat(event.getStatus(), is("OK")); 
      assertTrue(event.getData() != null); 
      testPassed[0] = true; 
     } 
    }; 

    //Set our test EventBus object 
    driver.setEventBus(eventBus); 
    // The actual method under test 
    driver.parseData(jsonParser.parse(json)); 

    // Set a countdown latch to wait for the result (5s) 
    latch.await(5000, TimeUnit.MILLISECONDS); 
    // will wait here until 5s or the @Subscrube method is hit 
    assertTrue(testPassed[0]); 
} 

//Because we want to examine EventBus Output, register it 
//to this class and pass the event back through our custom abstract class 
@Subscribe 
public void onReceiveEventBusEvent(DataTransfer event) { 
    assertNotNull(transferCallback); 
    transferCallback.onSuccess(event); 
    //notify latch so that we can proceed 
    latch.countDown(); 
    } 
} 
Các vấn đề liên quan