2016-05-13 36 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(); 
    } 
}