Какой лучший способ заблокировать поток во время теста, чтобы проверить его состояние? - PullRequest
1 голос
/ 15 марта 2011

Тестирование на Java (с использованием Mockito и Powermock, но готов использовать все, что решит эту проблему).У меня есть объект, который имеет следующую подпись:

public class MyClass {
   public void doRun() {
      //Do work
   }

   public int numberComplete() {
      //Return number of items complete
   }
}

Метод "doRun" получает список элементов и "завершает" их (каждый занимает значительное количество времени).Чтобы «получить» и «закончить» элемент, используется менеджер макетов, поэтому у меня есть такие тесты:

@Test public void managerIsInformedOfEachFinishedItem() {
  task.doRun();
  verify(mockManager, times(3)).finish((Item)any());
}

В конце я могу вызвать «task.numberComplete ()»и я вижу, что на самом деле задание возвращается 3. Но я действительно хотел бы сделать что-то вроде:

@Test public void managerIsInformedOfEachFinishedItem() {
  int count1, count2;
  when(mockManager.finish(item1).thenSet(count1 = task.numberComplete());
  when(mockManager.finish(item2).thenSet(count2 = task.numberComplete());

  task.doRun();

  assertEquals(1, count1);
  assertEquals(2, count2);
}

Я понимаю, что это, возможно, уже не доступно.Но если бы вы попытались реализовать что-то подобное (независимо от синтаксиса - мне все равно, насколько чисто тест читает изначально), как бы вы это сделали?Любые предложения / идеи приветствуются!

1 Ответ

0 голосов
/ 15 марта 2011

Вместо использования стороннего фальшивого фреймворка для менеджера, вы можете реализовать свой собственный менеджер фальшивых сообщений, который выполняет проверку для вас с помощью метода finish.Имейте в виду, что если finish будет вызван в другом потоке, то вы не должны помещать туда assertEquals, потому что AssertionError, брошенный в этот поток, скорее всего будет проигнорирован.Вместо этого вы можете сохранить результат успеха / неудачи в переменной-члене (свойстве) вашего mock-менеджера и проверить это после проверки.(Не забудьте синхронизировать доступ к этому общему значению результата или использовать atomic для его хранения.)

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