2013-05-14 3 views
1

Я пытаюсь узнать, как использовать Mockito, и я повесил трубку на том, как идти о проверке метода на определенном объекте, называемом X раз.Метод проверки Mockito вызывает

У меня есть следующий код теста

verify(record, times(1)).setValue(Mockito.any(String.class),Mockito.any(String.class)); 

и следующий кусок рабочего кода я пытаюсь проверить

Строка [] s Я настраиваю перебирать

protected String[] columnNames = {"_id", "created_at", "updated_at", "name"}; 
protected ColumnType[] columnTypes = {ColumnType.INTEGER, ColumnType.TIMESTAMP, ColumnType.TIMESTAMP, ColumnType.TEXT}; 

и код производства, который находится в петле, итерация через String []

for (int i = 0; i < columnCount; i++) { 

      if (columnNames[i].equals("_id")) { 
       record.setId(cursor.getInt(0)); 
      } else { 

       switch (columnTypes[i]) { 
        case BOOL: 
         record.setValue(columnNames[i], cursor.getInt(i)); 
         break; 
        case TEXT: 
         record.setValue(columnNames[i], cursor.getString(i)); 
         break; 
        case INTEGER: 
         record.setValue(columnNames[i], cursor.getInt(i)); 
         break; 
        case TIMESTAMP: 
         record.setValue(columnNames[i], cursor.getLong(i)); 
         break; 
        case LONG: 
         record.setValue(columnNames[i], cursor.getLong(i)); 
         break; 
        case DOUBLE: 
         record.setValue(columnNames[i], cursor.getDouble(i)); 
         break; 
        default: 
         record.setValue(columnNames[i], ""); 
         break; 
       } 
      } 
     } 

И это ошибка, я получаю

testDataSourceCanFindRecord (com.test.app.DataSourceTest) Время прошло: 0,081 сек < < < FAILURE! org.mockito.exceptions.verification.TooManyActualInvocations: customer.setValue (,); Требуется 1 раз: -> at com.test.app.DataSourceTest.testDataSourceCanFindRecord (DataSourceTest.java:141) Но был 3 раз. Нежелательные призывание: -> в com.test.core.DataSource.cursorToRecord (DataSource.java:210)

Я ожидаю record.setValue (ключ String, значение String) будет вызываться один раз из-за «имя» в строке []. Что происходит, Mockito регистрирует record.setValue (String key, Long value) как то же самое, что и record.setValue (String key, String value), что неверно. Строка 210 - это setValue в случае TIMESTAMP. Как я могу исправить это?

+0

Как вы создаете «курсор»? Я думаю, было бы намного проще использовать реальный объект 'record' без издевательств и убедиться, что значения верны после установки их из курсора. –

+0

Я издеваюсь над курсором. Я издеваюсь над всем, кроме тестируемого класса DataSource. Я все еще пытаюсь понять, что насмехается, а что нет. – David

ответ

0

Если вы посмотрите на исходный код для InvocationMatcher, похоже, что логика проверки равенства методов немного более щедра, чем вы могли бы подумать, и в некоторых случаях может игнорировать перегрузку метода.

Я не 100% уверен, но попробуйте заменить any(String.class) (который принимает any object из any type) с isA(String.class), которые будут отфильтровывать вызовы, где этот параметр не является строкой. (anyString проверяет только его тип в Mockito 2.0 и более поздних версиях.) Counterintuitively, any(Foo.class) не означает «ничего, пока это Foo», это означает «что угодно». This is due to change in Mockito 2.0.

Конечно, вы также можете затянуть проверку, чтобы проверить, что ключ или значение равно ожидаемому значению, но я не уверен, насколько это возможно в вашем случае.