2014-10-13 2 views
2

I, имеющие функцию Grails, где я использую отдельную тему:Grails блок тест + Thread

def testFunction() { 
    //..... 
    Thread.start() { 
    testService.somefunction() 
    } 
    //... 

} 

В тестовом модуле, я насмешливый сервисную функцию, как это:

def "test testfunction" { 
    //... 
    1 * testService.somefunction(_) 
    //.. 
} 

Однако я получаю ошибку непревзойденных вызовов, потому что Spock не обнаружил, что метод был выполнен в отдельном потоке.

1 * testService.somefunction(_) (0 invocations) 
Unmatched invocations (ordered by similarity): 

Я попытался с помощью этого http://spock-framework.readthedocs.org/en/latest/new_and_noteworthy.html#polling-conditions, но не имели никакого успеха.

Обновленный включает пример кода:

void "test without errors"() { 

     def conditions = new PollingConditions(timeout: 15) 

     def cmdList = new ArrayList<CommandClass>() 
     parseService.parseFile(file, _) >> commandList 
     nextService.create(_) >> commandList 
     controller.controllerService = nextService 
     controller.controllerParseService = parseService 

     when: 
     controller.testFunction() 

     then: 
     conditions.eventually { 
      assert response.contentAsString == "SUCCESS" 
     } 
    } 
+0

Можете ли вы пройти в своем точном тестовом коде вместо «// ...». Это может помочь определить, в чем проблема. – th3morg

+0

@ th3morg, это то, что я чувствовал конфиденциальность, но я уверен, что вышеприведенный фрагмент даст такую ​​хорошую идею. Проблема связана с кодом внутри 'Thread.start {}' –

+0

. Я не могу сказать, правильно ли вы настроили тест, не увидев весь тест. Вы даже можете предоставить полный тестовый код, а не функцию, которая является собственностью. Кроме того, были ли какие-то непревзойденные призывы? – th3morg

ответ

4

Per исходного код, вы, к сожалению, не можете проверить количество вызовов в традиционном способе, потому что в закрытии вы должны утверждает условие, так как закрытие не находится в контексте исполнителя спока. Я бы рекомендовал что-то вроде этого, который работал для меня:

def "test concurrency"(){ 
     given: 
      def conditions = new PollingConditions(timeout: 15) 
      MyService service = new MyService() 
      SomeService someService = Mock() 
      service.validationService = someService 
      int numInvocations = 0 
      someService.methodExecutedInThread(_) >> { 
       numInvocations++ 
       return null 
      } 
     when: 
      int i = 0 
      service.aMethod() 
     then: 
      conditions.eventually { 
       println "checked ${i}" // <--- you should see this checking repeatedly until the condition is met 
       i++ 
       assert numInvocations == 1 
      } 
    } 

Учитывая метод в «сервис»:

public void aMethod(){ 
     Thread.start{ 
      sleep(5000) 
      println "awake!" 
      someService.methodExecutedInThread("some param") 
     } 
    } 

Основываясь на своем обновленном примере кода:

К сожалению, вы пытаясь протестировать ответ, и это, к сожалению, не сработает, если вы отправляете ответ из потока. Не видя, как выглядит фактическая функция, я не могу сказать больше. Однако то, что я поставил выше, должно помочь ответить на ваш первоначальный вопрос.

+0

спасибо за ваше время, я не тестировал ваш код. Я застрял в какой-то другой проблеме, также теперь у меня нет возможности проверить этот код, потому что мой существующий код работает без «PollingConditions», t точная причина, по которой мой текущий код работает сейчас, и почему мой предыдущий код не работал должным образом. Я хочу убедиться, что все пошло не так. Также я попробую ваш код по возможности. Еще раз спасибо, +1 за ваше время –

+0

@Suganthan Мы можем попробовать мое предложение, чтобы определить, сработало ли оно для вас, а также утверждают, что у вас не было ложного положительного теста? – th3morg

+0

Честно говоря, я просто задавался вопросом, я действительно не имею правильного ответа на ваш вопрос, извините за это. Теперь я перевел код в производство без 'PollingConditions', но я применил' PollingConditions' только потому, что у меня возникла проблема с обработкой 'Thread'. Позвольте мне снова воспроизвести такую ​​ошибку или позволить ей повториться, потому что проблема не существует в течение последних 3 дней после непрерывного тестирования.Еще раз спасибо за ваше время –

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