Модульный тест EventBus на Android

Я уже видел этот ТАК вопрос, но он не дает решения того, что я пытаюсь сделать.

Я использую EventBus (от greenrobot) для отправки сообщений через мое приложение. Я хотел бы иметь возможность провести модульное тестирование моего приложения, чтобы убедиться, что сообщение было отправлено на шину. Только то.

Вот класс, который я хотел бы проверить с помощью одного метода, который отправляет сообщение:

public class CxManager {
    public void postMessage(JsonObject data) {
        EventBus.getDefault().post(new MyCustomEvent(data));
    }
}

И вот тест, который я пробовал, но не работает:

@RunWith(MockitoJUnitRunner.class)
public class CxManagerTest {

    @Mock EventBus eventBus;
    private CxManager cxManager;
    private JsonObject testJsonObject;

    @Before public void setUp() throws Exception {
        cxManager = new CxManager();

        testJsonObject = new JsonObject();
        testJsonObject.addProperty("test", "nada");
    }

    @Test public void shouldPass() {
        cxManager.postMessage(testJsonObject);

        verify(eventBus).post(new MyCustomEvent(testJsonObject));
    }
}

Я написал этот тест, даже зная, что он, скорее всего, потерпит неудачу, потому что EventBus использует Singleton для публикации сообщений, и я не знаю, как проверить выполняемый метод singleton.

Кроме того, это всего лишь часть большого проекта. Соответствующие штуки. И я хотел бы проверить правильность публикации сообщений в соответствии с различными взаимодействиями

1 ответ

Решение

Ваша проблема в том, что шина событий, которую отправляет CxManager, не является вашим фиктивным объектом. Вам нужно было бы реорганизовать свой код, чтобы передать EventBus в CxManager, либо напрямую, либо через внедрение зависимостей, чтобы он отправлял сообщения в этот eventBus, а не получал его сейчас.

В качестве альтернативы, получите экземпляр EventBus, который он действительно публикует, и подпишитесь на него. Здесь нет необходимости издеваться над EventBus здесь.

Другие вопросы по тегам