2016-05-13 15 views
6

Otto'nun etkinlik veriyolunu uygulamamda kullanıyorum. Sınıflarımdan birinde olayı gönderiyorum.Android'de Event Bus tarafından yayınlanan birim test yöntemleri nasıl?

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

İleti yöntemini test edebiliyorum.

Şimdi, olayı alan başka bir sınıf var.

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

Bu yöntemin çalıştırıldığını nasıl test ederim? Aşağıdaki kod

ile denedim ancak bu kod çalışmıyor.

+0

mockBus nedir? –

cevap

0

Çalışmıyor çünkü instance sahte değil. callAMethod'un etkilerini doğrulamanız veya bu yöntemi başka bir sınıfa koymanız ve bu yeni sınıfa ait bir hatayı ReceiverClass sınıfınıza enjekte etmeniz gerekecektir. Örneğin

...

private class ReceiverClass { 
    private MyNewClass theNewClassIWasTalkingAbout; 

    // Stick in a setter for that^

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

Sonra test hafifçe değiştirmek zorunda kalacak ... Bu yardımcı olur

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

Umut.

1

Partiye biraz geç kaldım, ancak burada asenkron çağrılar için çalışan ve hesaplayan bir sınıf örneğidir. EventBus Alay etmek yerine, bunun bir şey yapmasına izin verin ve aşağıdaki TestDriver sınıfına kaydedin.

Bu çalışmayı yapan şey, DataTransferCallback sınıfının yardımı ile latch.countDown() çağrısının beklendiği veya 5 saniye sürmesi beklenen CountDownLatch.

Test sınıfınızı ve @Subscribe yöntemini kaydettirin, DataTransferCallback modelini oluşturan yönteme geri aktarın ve oradaki ifadelerinizi yapı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(); 
    } 
}