2015-08-17 5 views
4

Предположим, что у нас есть интерфейс для функции обратного вызова как таковой:Как проверить функцию с обратным вызовом?

public interface Callback 
{ 
    void foo(); 
} 

И у нас есть метод, который вызывает функцию обратного вызова, который был дан в качестве аргумента:

public void doSomething(final Callback callback) 
{ 
    // Do something, like asynchronously fetch something from a server 
    asyncStuff.doSomethingAsync(new AsyncResponseHandler() 
    { 
     @Override 
     public void asyncStuffDone() 
     { 
      // Call the callback 
      callback.foo(); 
     } 
    }); 
} 

Теперь на вопрос: Учитывая такой сценарий, как можно проверить, действительно ли вызван обратный вызов?

+0

вы используете насмешливые рамки, такие как [Mockito] (https://code.google.com/p/mockito/)? –

+0

@MickMnemonic У меня есть Mockito, хотя я еще не включил его. В данный момент я просто изучаю Junit и общее тестирование. Если на вопрос можно ответить Mockito, все в порядке. – manabreak

ответ

3

Поставьте объект Callback для проверки и подтвердите, что метод был вызван. Например, с помощью Mockito как насмешливый библиотеки, вы можете создать фиктивный объект (организовать):

Callback myMock = mock(Callback.class); 

Затем поставить его в код тестируется (акт):

someObject.doSomething(myMock); 

И проверить, что метод был вызван (утверждает):

verify(myMock, times(1)).foo(); 
+0

Спасибо. У меня есть два вопроса: где я могу вызвать функцию 'verify()'? Что делать, если для асинхронного вызова требуется некоторое время (10 мс, 100 мс, 1 с ...)? – manabreak

+0

@manabreak: Вы бы назвали это в своем модульном тесте частью шага «assert». Что касается асинхронных вызовов, в коде в вашем вопросе нет ничего асинхронного, поэтому на самом деле не совсем понятно, что вы имеете в виду. Строка 'verify()' не будет выполняться до завершения операции 'someObject.doSomething()'. – David

+0

Возможно, я был неясен с моим примером кода. Я в основном имел в виду, что обратный вызов будет вызываться асинхронно. – manabreak

Смежные вопросы