Можно ли запросить аргументы, переданные объекту Mockito? - PullRequest
6 голосов
/ 23 июня 2011

В данный момент я изучаю Mockito, и одна из вещей, которые я делаю для консолидации своего обучения, - это преобразование старого теста JUnit из использования ручного свернутого класса mockito в класс, в котором вместо этого используются mockito mock. Тем не менее, я столкнулся с ситуацией, я не уверен, как справиться.

В частности, мой тестируемый модуль создает String, который передается в макетируемый объект в качестве параметра при вызове метода для него. Я хотел бы проверить, что String построен правильно. Проблема в том, что часть String является хеш-ключом, который генерируется внутри и изменяется при каждом вызове. Одно из решений, которое бы сработало, - это получить генерацию хэша под моим контролем и добавить фиктивный генератор для выполнения теста. Тем не менее, это немало работы.

Мой старый ручной класс будет хранить передаваемые ему аргументы, которые я мог запросить в своем тесте. Это позволило мне запросить начало и конец String с помощью следующего:

assertTrue(mockFtpClient.getFilePathAndName().startsWith("/data/inbound/XJSLGG."));
assertTrue(mockFtpClient.getFilePathAndName().endsWith(".pdf"));

Это было достаточно для моего вкуса. Поэтому мой вопрос: возможно ли использовать Mockito для запроса или получения аргументов, переданных методу, чтобы я мог выполнить что-то похожее на вышеприведенное?

ОБНОВЛЕНИЕ 24/06/2011 : В этот момент я исключил ответ Гнона. Однако с тех пор я обнаружил кое-что, что работает лучше для меня. А именно ArgumentCaptor. Вот как это работает:

ArgumentCaptor<String> fileNameArgument = ArgumentCaptor.forClass(String.class);
verify(mockFtpClient).putFileOnServer(fileNameArgument.capture());
assertTrue(fileNameArgument.getValue().startsWith(START_FILE_NAME) &&
           fileNameArgument.getValue().endsWith(END_FILE_NAME));

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

Ответы [ 2 ]

3 голосов
/ 23 июня 2011

В основном вам нужно использовать argThat () в Mockito, что позволяет вам рассматривать Hamcrest Matcher в качестве аргумента проверки. Вот код, который вы используете для создания пользовательских утверждений переданного аргумента:

@Test
public void testname() throws Exception {
    HashReceiver receiver = mock(HashReceiver.class);
    receiver.set("hash");
    verify(receiver).set(argThat(new HashMatcher()));
}

class HashMatcher extends BaseMatcher<String> {
    @Override
    public boolean matches(Object item) {
        String hash = (String) item;
        if (hash.startsWith("/data/inbound/XJSLGG.") && hash.endsWith(".pdf"))
            return true;
        return false;
    }
}

// Mocked
class HashReceiver {
    public void set(String hash) {
    }
}

Вместо этого вы можете использовать универсальное сопоставление или комбинацию универсальных сопоставителей.

1 голос
/ 23 июня 2011

Посмотрите на принятый ответ на этот вопрос. mockito-how-to-make-a-method-return-an-аргумент, который был передан ему он покажет вамкак получить аргументы, передаваемые вашему вызову фиктивного метода.

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