Тестовые случаи Спока терпят неудачу, когда множественные тесты связаны с асин * * * * клиентскими вызовами, но успешно выполняются при индивидуальном запуске - PullRequest
0 голосов
/ 07 апреля 2020

Тестовый сценарий заключается в получении результата от службы фиктивного клиента, вызываемой асинхронно. Здесь, если я попытаюсь запустить упомянутые тесты индивидуально, они будут выполнены успешно. Но при попытке построить проект с помощью mvn clean install, контрольный пример успеха выдает ошибку.

Как мне обработать сценарий исключения, чтобы он не влиял на ожидаемые сценарии поведения метода? Или, возможно, в чем причина нескольких асин c вызовов? Как мне обработать / завершить порожденный поток или дождаться его завершения, прежде чем начать следующий клиентский вызов?

// SERVICE CLASS
public String serviceMethod(String arg1, String arg2) { 
   return mockedclient.fetchDetails(arg1, arg2)
                 .toCompletableFuture()
                 .thenapplyasync(HashSet::new) // assuming the received response is a list
                 .get(3,TimeUnit.SECONDS);
}
//TEST CLASS
def " should return result retrieved from the client" () {
   given:
   def arg1 = "value1"
   def arg2 = "value2"

   def futureList = CompletableFuture.completedFuture(Collections.toList("RESULT"))
   def futureSet = new BlockingVariable<Set<String>>()

   when:
   def result = serviceMethod(arg1, arg2)

   then:
   1 * mockedClient.fetchDetails(_) >> futureList
   0 * futureList.thenApplyAsync(_) >> futureSet
   0 * futureSet.get(_,_) >> Collections.toSet("RESULT")
 }


def " should return empty response when result retrieved from the client" () {
   given:
   def arg1 = "value1"
   def arg2 = "value2"

   def futureList = CompletableFuture.completedFuture(Collections.toList("RESULT"))
   def futureSet = new BlockingVariable<Set<String>>()


   when:
   def result = serviceMethod(arg1, arg2)

   then:
   1 * mockedClient.fetchDetails(_) >> CompletableFuture.runAsync( { throw new Exception("Failed to fetch broker Analyst details " } )
   0 * futureList.thenApplyAsync(_) >> futureSet
   0 * futureSet.get(_,_) >> Collections.toSet("RESULT")
 }

1 Ответ

0 голосов
/ 09 апреля 2020

Это не полный ответ, потому что вы также не предоставили полный MCVE . Поэтому я не могу воспроизвести вашу проблему путем копирования, компиляции и запуска фрагментов кода. Но некоторые вещи кажутся мне странными:

  • Вы просто говорите, что что-то не работает, но не показывает никаких сообщений об ошибках и трассировки стека.

  • Ваш производственный класс обслуживания использует mockedclient, по крайней мере название странное. Почему вы используете макет в производстве или тестируете что-то, используя макет?

  • futureList в обоих методах объектов - это не макет, а реальный объект. Таким образом, вы не можете проверять взаимодействия и возвращать окурки, например 0 * futureList.thenApplyAsync(_) >> futureSet.

  • futureSet в обоих методах объектов - это не имитация, а реальный объект. Таким образом, вы не можете проверять взаимодействия и возвращать окурки, например 0 * futureSet.get(_,_) >> Collections.toSet("RESULT").

  • В обоих методах объектов вы используете переменную mockedClient, но забыли показать, где и как она определена /initialised.

Я предполагаю, что ваши тесты выдают ошибки не только в Maven, но и локально, потому что, в общем, они содержат ошибки.

...