2016-05-13 51 views
6

我在我的應用程序中使用了Otto的事件總線。在我的一個課程中,我發佈了這個活動。如何在Android中發佈由Event Bus發佈的方法?

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

我能夠測試post方法。

現在有另一個班正在接收事件。

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

我該如何測試這個方法是否被調用。我試着用下面的測試代碼

@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(); 
} 

但是這段代碼不起作用。

+0

什麼是mockBus? –

回答

0

它不起作用,因爲instance不是模擬。你將不得不驗證callAMethod的效果,或者將該方法應用到另一個類中,並將這個新類的模擬注入到ReceiverClass類中。

例如...

private class ReceiverClass { 
    private MyNewClass theNewClassIWasTalkingAbout; 

    // Stick in a setter for that^

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

那麼你的測試將有略微改變......

@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(); 
} 

希望這有助於。

1

我對派對有點遲到,但這裏是一個工作和解釋異步調用的類的例子。我們不是模擬EventBus,而是簡單地讓它執行它,並將其註冊到下面的TestDriver類中。

使這項工作的東西是CountDownLatch其中,在抽象DataTransferCallback類的幫助下,等待latch.countDown()被調用或5秒過去。

只需註冊您的測試類並在@Subscribe方法中,將其傳回給創建DataTransferCallback的方法,並在那裏進行斷言。

@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(); 
    } 
}