mockito: как разблокировать метод? - PullRequest
32 голосов
/ 14 ноября 2011

У меня есть класс JUnit с различными методами для выполнения разных тестов.

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

Есть ли способ, просто для очистки после меня, в случае, если некоторые другие тесты, которые запускаются после моих тестов, также используют те же экземпляры и могут выполнитьсмоделированный метод, который они не просили смоделировать, размешать метод?

скажем, у меня есть шпионский объект с именем 'wareHouseSpy'

говорят, что я переопределил метод isSomethingMissing :

doReturn(false).when(wareHouseSpy).isSomethingMissing()

Какой будет правильный способ отменить отмену и вернуть все в нормальное состояние на шпионе, то есть сделать следующий вызов isSomethingMissing запустить реальный метод?

что-то вроде

doReturn(Mockito.RETURN_REAL_METHOD).when(wareHouseSpy).isSomethingSpy()

или, может быть

Mockito.unmock(wareHouseSpy)

Кто знает?Я ничего не мог найти в этой области

Спасибо!

Ассаф

Ответы [ 6 ]

39 голосов
/ 14 ноября 2011

Я думаю,

Mockito.reset(wareHouseSpy)

сделает это.

11 голосов
/ 16 февраля 2016

Допустим, в большинстве ваших тестов используется ответ с заглушкой. Тогда у вас будет метод setUp (), который выглядит следующим образом:

@Before
public void setUp() {
  wareHouseSpy = spy(realWarehouse);
  doReturn(false).when(wareHouseSpy).isSomethingMissing();
}

Теперь предположим, что вы хотите отменить ответ с заглушкой и использовать реальную реализацию в одном тесте:

@Test
public void isSomethingMissing_useRealImplementation() {
  // Setup
  when(wareHouseSpy.isSomethingMissing()).thenCallRealMethod();

  // Test - Uses real implementation
  boolean result = wareHouseSpy.isSomethingMissing();
}
7 голосов
/ 14 ноября 2011

Это зависит от того, проводите ли вы тестирование с помощью TestNG или JUnit.

  • JUnit создает новый экземпляр для каждого метода тестирования.По сути, вам не нужно беспокоиться о сбросе макетов.
  • С TestNG вы должны сбросить макеты с помощью Mockito.reset(mockA, mockB, ...) в @BeforeMothod или @AfterMethod
3 голосов
/ 14 ноября 2011

Может быть, я не слежу, но когда у вас есть реальный объект real:

Object mySpy = spy(real);

Затем " unspy " mySpy ... просто используйте real.

2 голосов
/ 14 ноября 2011

«Нормальный» способ - создать экземпляр в вашем методе «setUp». Однако, если у вас есть реальный объект, который по какой-то причине стоит дорого, вы можете сделать что-то вроде этого:

public class MyTests {

  private static MyBigWarehouse realWarehouse = new MyBigWarehouse();
  private MyBigWarehouse warehouseSpy;

  @Before
  public void setUp() {
    warehouseSpy = spy(realWarehouse); // same real object - brand new spy!
    doReturn(false).when(wareHouseSpy).isSomethingMissing();
  }

  @Test
  ...

  @Test
  ...

  @Test
  ...
}
0 голосов
/ 14 ноября 2011

Обращаясь к этой части конкретно:

Есть ли способ, просто ради очистки после меня, на случай, если некоторые другие тесты, которые запускаются после моих тестов, также используют те же экземпляры и могут выполнить поддельный метод, который они не просили смоделировать, отменить его метод?

Если вы используете JUnit, самый чистый способ сделать это - использовать @Before и @After (у других платформ есть эквиваленты) и воссоздать экземпляр и шпиона, чтобы ни один тест не зависел от того, что вы сделали на любом другом тесте. Затем вы можете выполнить тестовую настройку шпиона / макета внутри каждого теста. Если по какой-то причине вы не хотите воссоздать объект, вы можете воссоздать шпиона. В любом случае, каждый начинает с новым шпионом каждый раз.

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