2016-05-13 2 views
6

私のアプリケーションでは、Ottoのイベントバスを使用しています。私のクラスの一つで、私はイベントを投稿しています。イベントバスでアンドロイドに投稿されたテストメソッドをどのようにユニット化するのですか?

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をMockingするのではなく、以下のTestDriverクラスに登録するだけです。

この作業を行うのは、です。DataTransferCallbackクラスの助けを借りて、latch.countDown()が呼び出されるのを待っています。

テストクラスを登録し、@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(); 
    } 
} 
関連する問題