Я использую создание приложения с использованием mapreduce2 и тестирование с использованием MRUnit 1.1.0. В одном из тестов я проверяю выход редуктора, который помещает «текущее системное время» в его выход. То есть во время выполнения редуктора отметка времени используется в context.write()
, которая должна быть записана вместе с остальной частью вывода. Теперь, хотя я использую тот же метод, чтобы найти системное время в методе тестирования, как тот, который я использую в редукторе, времена, рассчитанные в обоих, как правило, разделены на две части, например 2016-05-31 19:10:02
и 2016-05-31 19:10:01
. Таким образом, выход в двух случаях будет другим, например:Тонкая настройка вывода перед тестированием с использованием MRUnit
test_fe01,2016-05-31 19:10:01
test_fe01,2016-05-31 19:10:02
Это вызывает ошибку утверждения. Я хочу игнорировать это различие в методах времени, поэтому тесты проходят, если остальная часть вывода, кроме метки времени, сопоставляется. Я ищу способ издеваться над методом, используемым для возврата системного времени, так что возвращается твердое значение, а редуктор и тест используют этот издеваемый метод во время теста. Возможно ли это сделать? Любая помощь будет оценена.
С наилучшими пожеланиями
EDIT: Я уже пробовал функциональность шпиона Mockito в в моем тесте:
MClass mc = Mockito.spy(new MClass());
Mockito.when(mc.getSysTime()).thenReturn("FakeTimestamp");
Однако это дает ошибку во время выполнения:
org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.
For example:
when(mock.getArticles()).thenReturn(articles);
Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.
2. inside when() you don't call method on mock but on some other object.
3. the parent of the mocked class is not public.
It is a limitation of the mock engine.
Метод getSysTime()
является общедоступным и статическим, а класс MClass
является общедоступным и не имеет родительских классов.
Звучит как решение, но нельзя ли этого сделать без добавления какого-либо кода в редуктор? Я хотел бы издеваться над методом String getSysTime(), который реализован в моем приложении (и который возвращает текущее системное время), в моем тесте, чтобы этот метод возвращал жестко запрограммированную метку времени. –
Вы можете расширить свой редуктор и переопределить этот метод или, возможно, использовать что-то вроде Mockito, чтобы высмеять этот конкретный метод: http://stackoverflow.com/questions/14970516/use-mockito-to-mock-some-methods-but-not- другие –
Метод не в моем классе редуктора, и существует длинная цепочка вызовов, через которые возвращается метка времени. Вопрос, который я опубликовал, содержит множество абстракций и упрощений. Для решения конфигурации также потребуется добавить объект конфигурации в список параметров всех методов, задействованных в цепочке. Решение могло бы сработать, но вызвало бы много нежелательных сложностей и регрессии. Идеальное решение в моем случае было бы издеваться над одним конкретным методом этого одного класса в моем тесте, но я не уверен, как его достичь. –