Как сделать издевательство над недействительными методами с mockito

Как издеваться над методами с типом возврата void?

Я реализовал шаблон Observer, но я не могу издеваться над ним с Mockito, потому что я не знаю, как это сделать.

И я попытался найти пример в Интернете, но не смог.

Мой class выглядит

public class World { List listeners; void addListener(Listener item) { listeners.add(item); } void doAction(Action goal,Object obj) { setState("i received"); goal.doAction(obj); setState("i finished"); } private string state; //setter getter state } public class WorldTest implements Listener { @Test public void word{ World w= mock(World.class); w.addListener(this); ... ... } } interface Listener { void doAction(); } 

Система не запускается с макетом. = (Я хочу показать вышеупомянутое состояние системы и сделать утверждение в соответствии с ними.

Взгляните на документы API Mockito. Как упоминается связанный документ (пункт № 12), вы можете использовать любые doThrow() , doAnswer() , doNothing() , doReturn() из среды Mockito, чтобы издеваться над методами void.

Например,

 Mockito.doThrow(new Exception()).when(instance).methodName(); 

или если вы хотите совместить его с последующим поведением,

 Mockito.doThrow(new Exception()).doNothing().when(instance).methodName(); 

Предполагая, что вы смотрите на насмешку setter setState(String s) в classе World ниже, код использует метод doAnswer для издевательства setState .

 World mockWorld = mock(World.class); doAnswer(new Answer() { public Void answer(InvocationOnMock invocation) { Object[] args = invocation.getArguments(); System.out.println("called with arguments: " + Arrays.toString(args)); return null; } }).when(mockWorld).setState(anyString()); 

Я думаю, что я нашел более простой ответ на этот вопрос, чтобы назвать реальный метод только для одного метода (даже если он имеет возврат void), вы можете сделать это:

 Mockito.doCallRealMethod().when().(); .(); , Mockito.doCallRealMethod().when().(); .(); 

Или вы можете назвать реальный метод для всех методов этого classа, делая следующее:

   = mock(.class, Mockito.CALLS_REAL_METHODS); 

Добавляя к тому, что сказал @sateesh, когда вы просто хотите высмеять метод void, чтобы предотвратить его вызов, вы можете использовать Spy следующим образом:

 World world = new World(); World spy = Mockito.spy(world); Mockito.doNothing().when(spy).methodToMock(); 

Когда вы хотите запустить свой тест, убедитесь, что вы вызываете метод в тесте на объекте spy а не на объекте world . Например:

 assertEquals(0,spy.methodToTestThatShouldReturnZero()); 

Решение так называемой проблемы заключается в использовании spy Mockito.spy (…) вместо mockito.mock (..) .

Шпион позволяет нам частично насмехаться. Мокито хорош в этом вопросе. Поскольку у вас есть class, который не является полным, таким образом вы издеваетесь над каким-то необходимым местом в этом classе.

Прежде всего: вы должны всегда импортировать статичные mockito, таким образом, код будет намного читабельнее (и интуитивно понятным):

 import static org.mockito.Mockito.*; 

Для частичного издевательств и сохранения оригинальной функциональности остальное mockito предлагает «Шпион».

Вы можете использовать его следующим образом:

 private World world = spy(World.class); 

Чтобы исключить выполнение метода, вы можете использовать что-то вроде этого:

 doNothing().when(someObject).someMethod(anyObject()); 

для приведения некоторого пользовательского поведения в метод используйте «когда» с «thenReturn»:

 doReturn("something").when(this.world).someMethod(anyObject()); 

Для получения дополнительных примеров, пожалуйста, найдите образцы mockito в документе.

Как высмеивать недействительные методы с помощью mockito – есть два варианта:

  1. doAnswer – Если мы хотим, чтобы наш doAnswer метод пустоты что-то делал (издевательствовал поведение, несмотря на то, что он был недействительным).
  2. doThrow – Тогда есть Mockito.doThrow() если вы хотите выбросить исключение из метода Mockito.doThrow() void.

Ниже приведен пример того, как его использовать (не идеальный usecase, а просто хотел проиллюстрировать основное использование).

 @Test public void testUpdate() { doAnswer(new Answer() { @Override public Void answer(InvocationOnMock invocation) throws Throwable { Object[] arguments = invocation.getArguments(); if (arguments != null && arguments.length > 1 && arguments[0] != null && arguments[1] != null) { Customer customer = (Customer) arguments[0]; String email = (String) arguments[1]; customer.setEmail(email); } return null; } }).when(daoMock).updateEmail(any(Customer.class), any(String.class)); // calling the method under test Customer customer = service.changeEmail("[email protected]", "[email protected]"); //some asserts assertThat(customer, is(notNullValue())); assertThat(customer.getEmail(), is(equalTo("[email protected]"))); } @Test(expected = RuntimeException.class) public void testUpdate_throwsException() { doThrow(RuntimeException.class).when(daoMock).updateEmail(any(Customer.class), any(String.class)); // calling the method under test Customer customer = service.changeEmail("[email protected]", "[email protected]"); } } 

Вы можете найти более подробную информацию о том, как издеваться и тестировать методы пустоты с помощью Mockito в моем сообщении. Как насмехаться с Mockito (всестороннее руководство с примерами)

Добавление другого ответа на кучу (не каламбур) …

Вам нужно вызвать метод doAnswer, если вы не можете \ не использовать шпион. Однако вам необязательно катить собственный ответ . Существует несколько реализаций по умолчанию. Примечательно, что CallsRealMethods .

На практике это выглядит примерно так:

 doAnswer(new CallsRealMethods()).when(mock) .voidMethod(any(SomeParamClass.class)); 

Или:

 doAnswer(Answers.CALLS_REAL_METHODS.get()).when(mock) .voidMethod(any(SomeParamClass.class)); 

Я думаю, ваши проблемы связаны с вашей тестовой структурой. Мне было трудно смеяться над традиционным методом реализации интерфейсов в тестовом classе (как вы это делали здесь).

Если вы реализуете слушателя как макет, вы можете проверить взаимодействие.

 Listener listener = mock(Listener.class); w.addListener(listener); world.doAction(..); verify(listener).doAction(); 

Это должно удовлетворить вас тем, что «мир» поступает правильно.

В Java 8 это можно сделать немного чище, если у вас есть статический импорт для org.mockito.Mockito.doAnswer :

 doAnswer((i) -> { // Do stuff with i.getArguments() here return null; }).when(*mock*).*method*(*methodArguments*); 

return null; важно, и без него компиляция не сработает с некоторыми довольно неясными ошибками, поскольку она не сможет найти подходящее переопределение для doAnswer .

Например, ExecutorService который сразу же выполняет любой Runnable переданный для execute() может быть реализован с использованием:

 doAnswer((i) -> { ((Runnable) i.getArguments()[0]).run(); return null; }).when(executor).execute(any()); 

@ashley: работает для меня

 public class AssetChangeListenerImpl extends AbstractAssetChangeListener implements AssetChangeListener { @Override public void onChangeEvent(final EventMessage message) throws EventHubClientException { execute(message); } } } public class AbstractAssetChangeListener { protected void execute( final EventMessage message ) throws EventHubClientException { executor.execute( new PublishTask(getClient(), message) ); } } @RunWith(MockitoJUnitRunner.class) public class AssetChangeListenerTest extends AbstractAssetChangeListenerTest { public void testExecute() throws EventHubClientException { EventMessage message = createEventMesage(EventType.CREATE); assetChangeListener.execute(message); verify(assetChangeListener, times(1)).execute(message); } } 
  • При использовании Mokito в чем разница между фактическим объектом и издеваемым объектом?
  • Как выводить в CLI во время выполнения модульных тестов PHP?
  • Использование Mockito для тестирования абстрактных classов
  • Selenium many Logs (Как удалить)
  • Является ли UnitOfWork и GenericRepository шаблоном избыточным в первом коде EF 4.1?
  • Mockito - разница между doReturn () и когда ()
  • Как запустить NUnit в режиме отладки из Visual Studio?
  • Что делает хороший модульный тест?
  • Смыкая свободную функцию
  • Как вы издеваетесь над коллекцией объектов сеанса с помощью Moq
  • Как утверждать, что Iterable содержит элементы с определенным свойством?
  • Interesting Posts

    Можно ли комбинировать вычислительную мощность 2 компьютеров?

    jQuery ajax upload с индикатором выполнения – без вспышки

    Как создать загрузочный USB-ключ Linux, который работает на Mac (Intel 64-битный процессор)?

    Лучший способ вставить временную метку в Vim?

    Как удалить элементы меню призрак в Windows 7?

    Как нарисовать форму волны музыкального плеера Android?

    Черный экран при загрузке без биоса

    jQuery для извлечения и установки выбранного значения параметра элемента html select

    Как загрузить сборку во время выполнения перед событием AssemblyResolve?

    Как сжечь изображение iso с помощью Windows 8 Consumer Preview для USB-накопителя на Mac OS X

    Android-подход для «Оцените мое приложение»

    Создание экземпляра с использованием Ninject с дополнительными параметрами в конструкторе

    Звук центрального процессора звучит громко. Когда он запускается

    Отношения доверия между этой рабочей станцией и основным доменом не удались

    Каковы плюсы и минусы работы IIS как 32-битного или 64-битного на 64-битной ОС?

    Давайте будем гением компьютера.