В данный момент я изучаю 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
, как правило, является лучшим выбором, когда у вас есть одноразовое требование к определению аргумента, как я здесь.