Асинхронное тестирование, если удаленный метод был вызван - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь использовать блокирующие переменные для моего асинхронного тестирования, следуя этому вопросу

Проверка макета Спока с указанным временем ожидания

Я просто хочу знать, что конецМетод был вызван.Я попытался скопировать принятый ответ, но блокирующая переменная не была установлена.

Блокирующая переменная просто отключается.

Итак, у меня есть

@TestConfiguration
    static class ITRouterConfiguration {

        private DetachedMockFactory factory = new DetachedMockFactory()

        @Bean
        IVoucherService voucherService() {
            return factory.Mock(IVoucherService)
        }

    }

@Autowired
    private IVoucherService voucherService

 def 'Should create a voucher'() {

        MockQueue mockQueue = mockDestinationManager.createQueue("SERVICE_REQUEST")
        Assert.assertNotNull(jmsTemplate);
        Assert.assertNotNull(mockDestinationManager);

        given:
        def result = new BlockingVariable<Boolean>(0.2) // 200ms
        voucherService.createVoucher() >> {
            result.set(true)
        }
        when: 'a message is sent'
        jmsTemplate.send(mockQueue, new MessageCreator() {


            @Override
            Message createMessage(Session session) throws JMSException {
                TextMessage message = session.createTextMessage(BODY)
                message.setStringProperty(ACTION_TYPE, CREATE)
                return message
            }
        })
        //sleep(2000)

        then: 'check create voucher was called once'
        result.get()
    }

BlockingVariable.get() timed out after 10.00 seconds

    at spock.util.concurrent.BlockingVariable.get(BlockingVariable.java:113)
    at uk.co.cpp.servicerequestrouter.CreateVoucherSpec.Should create a voucher(CreateVoucherSpec.groovy:81)

Если я выйду из спящего режимаи просто утверждают

1 * voucherService.createVoucher(_)

это работает, но я не хочу.

1 Ответ

0 голосов
/ 22 октября 2018

Вы можете использовать CountDownLatch .

    given:
    def latch = new CountDownLatch(1)

    when: 'a message is sent'
    jmsTemplate.send(mockQueue, new MessageCreator() {

        @Override
        Message createMessage(Session session) throws JMSException {
            TextMessage message = session.createTextMessage(BODY)
            message.setStringProperty(ACTION_TYPE, CREATE)
            return message
        }
    })
    latch.await(10, TimeUnit.SECONDS) // must be in when-block, use timeout variant

    then: 'check create voucher was called once'
    1 * voucherService.createVoucher(_)  >> {
        latch.countDown()
    }
...