Как протестировать интерфейс прослушивателя вызывается в тесте Android Unit

У меня есть следующая (примерная) структура в моем приложении для Android, в котором я пытаюсь написать единичный тест для:

class EventMonitor { private IEventListener mEventListener; public void setEventListener(IEventListener listener) { mEventListener = listener; } public void doStuff(Object param) { // Some logic here mEventListener.doStuff1(); // Some more logic if(param == condition) { mEventListener.doStuff2(); } } } 

Я хочу убедиться, что когда я передаю определенные значения param , вызываются правильные методы интерфейса. Могу ли я сделать это в рамках стандартной структуры JUnit, или мне нужно использовать внешнюю структуру? Это образец единичного теста, который мне хотелось бы:

 public void testEvent1IsFired() { EventMonitor em = new EventMonitor(); em.setEventListener(new IEventListener() { @Override public void doStuff1() { Assert.assertTrue(true); } @Override public void doStuff2() { Assert.assertTrue(false); } }); em.doStuff("fireDoStuff1"); } 

Я также новичок в Java, поэтому, если это не очень хороший образец для тестирования, я готов изменить его на нечто более проверяемое.

Здесь вы хотите протестировать EventMonitor.doStuff(param) и при выполнении этого метода вы хотите убедиться, что были задействованы правильные методы в IEventListener или нет.

Итак, чтобы проверить doStuff(param) , вам не нужно иметь реальную реализацию IEventListener : вам нужна всего лишь макетная реализация IEventListener и вам нужно проверить точное количество вызовов метода на IEventListener во время тестирования doStuff , Это может быть достигнуто с помощью Mockito или любой другой насмешливой структуры.

Вот пример с Mockito:

 import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; public class EventMonitorTest { //This will create a mock of IEventListener @Mock IEventListener eventListener; //This will inject the "eventListener" mock into your "EventMonitor" instance. @InjectMocks EventMonitor eventMonitor = new EventMonitor(); @Before public void initMocks() { //This will initialize the annotated mocks MockitoAnnotations.initMocks(this); } @Test public void test() { eventMonitor.doStuff(param); //Here you can verify whether the methods "doStuff1" and "doStuff2" //were executed while calling "eventMonitor.doStuff". //With "times()" method, you can even verify how many times //a particular method was invoked. verify(eventListener, times(1)).doStuff1(); verify(eventListener, times(0)).doStuff2(); } } 
Intereting Posts