Модульный тест 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 здесь.