2016-12-14 2 views
1

Как мы можем заменить тело метода метода пустоты заглушки? Что-то вроде этого:Обрезание метода пустоты в mockito с побочными эффектами

interface Foo { 
    void foo(Integer j); 
} 

(...) 

Foo mockFoo = mock(Foo.class); 

Answer<Void> ans = invocation -> { 
      Object[] args = invocation.getArguments(); 
      System.out.println("called with arguments: " + Arrays.toString(args)); 
      return null; 
     }; 

when(mockFoo.foo(any())).thenAnswer(ans); 

(...) 

mockFoo.foo(5) // Should print out "called with arguments: [5]" 

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

Мы пытались doAnswer(ans).when(mockFoo).foo(any());, но это, кажется, выполнить тело АНС лямбда несколько раз при настройке издеваться, и он сбрасывает нашу переменную mockFoo в «нулевой» по какой-то странной причине между .when(mockFoo) и .foo(any()) вызовов.

Так эффективно:

Foo mockFoo = mock(Foo.class) 
// mockFoo is an instance of a Foo$MockitoMock 

Foo o = doAnswer(ans).when(mockFoo); 
// mockFoo just became null at this point..?! 
o.foo(any()); 

P.S. Мы используем VertxUnitRunner для запуска теста, но проблема сохраняется и с MockitoJUnitRunner.

Спасибо, Акос VÄNDRA

+0

См. Http://stackoverflow.com/questions/2276271/how-to-make-mock-to-void-methods-with-mockito – pringi

+0

То, что у вас есть, является правильным, и, безусловно, нет причин, по которым 'mockFoo' должен быть сброшен. Вместо отрывков, которые вы опубликовали, можете ли вы показать нам фактическую настройку тестового тела? Я чувствую, что ваша проблема там, а не код, который вы опубликовали. –

+0

@JeffBowman Вы были правы. В моем фактическом тесте я поставлял any() как параметр для int, который, по-видимому, был причиной. Замена его на anyInt() устраняет проблему. –

ответ

0

Решенный в комментариях:

Вы были правы. В моем фактическом тесте я поставлял any() как параметр для int, который, по-видимому, был причиной. Замена его на anyInt() устраняет проблему.

Это трудно предупредить о, потому что исключение происходит от значения по умолчанию null Mockito (в необходимость из-за стирание) быть автоматически распакованными (необходимо из Java 5+ семантики), которая находится вне контроля Mockito и до Mockito знает, какой метод подпишет ваш тест пытается позвонить. Это также не исключение Mockito или даже исключение, которое Mockito намеренно вызывает, поэтому сообщение об ошибке сложно изменить с помощью предложений.

Для всех видов использования макетов Mockito в примитивных значениях используйте соответствующий примитив: anyInt, intThat и т. Д.

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