Интеграционный тест Grails Quartz Job - не с автоматическим подключением

Я пишу интеграционный тест для кварцевого задания в приложении Grails. У меня есть работа в папке grails-app/jobs, и если я запускаю приложение, оно работает. Проблема в том, что я хочу получить его в интеграционном тесте, но автопровод не будет работать. Тест похож на:

class MyJobTest{
    MyJob myJob
    def setUp(){
        assert myJob != null
    }

    def testExecute(){
         //test logic
    }

}

но это терпит неудачу, потому что myJob нулевой... некоторая помощь?

1 ответ

Решение

Кварцевые работы не имеют автоматического подключения, как сервисы в тестовой среде. В документации для задания Quartz также прямо указано, что по умолчанию оно не будет выполняться по расписанию в тестовой среде (вы можете изменить это, если хотите, но я бы не стал). Я бы просто создал экземпляр myJob = new MyJob() в вашем setUp и позвонить execute() способ проверить это. Если вы пытаетесь проверить триггеры, возможно, вы захотите найти способ посмотреть, что находится внутри triggers {} может быть, проверяя метакласс?

РЕДАКТИРОВАТЬ В ОТВЕТ НА КОММЕНТАРИЙ:

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

Предполагая, что ваш класс выглядит примерно так:

class MyJob {
    def myServiceA
    def myServiceB

    def execute() {
        if(myJobLogicToDetermineWhatToDo) {
            myServiceA.doStuff(parameter)
        } else {
            myServiceB.doStuff(parameter)
        }

    }        
}

То, что вы действительно хотите проверить здесь, это myJobLogicToDetermineWhatToDo, Я бы предположил, что у вас есть (или вы можете легко написать) интеграционные и / или модульные тесты с вашими сервисами myServiceA и myServiceB, чтобы убедиться, что они работают правильно. Затем я бы написал модульные тесты для проверки логики / проводки вашей работы в соответствующую службу.

@Test
void routeOne() {
    def job = new MyJob()
    def myServiceA = new Object()
    def expectedParameter = "Name"
    def wasCalled = false
    myServiceA.metaClass.doStuff = {someParameter ->
        assert expectedParameter == someParameter
        wasCalled = true
    }
    job.myServiceA = myServiceA
    //Setup data to cause myServiceA to be invoked

    job.execute()

    assert wasCalled
}

Затем повторите этот процесс для всех маршрутов, проходящих через вашу работу. Таким образом, вы можете изолировать свои тесты до мельчайших частей и проверить логику объекта, который вы вызываете, а не сервисов, которые он использует. Я предполагаю, что вы используете сервис, потому что логика там используется другой частью системы. Если вы тестируете сервис с помощью этой работы и по какой-то причине работа уходит, вам нужно переписать свои тесты, чтобы вызвать сервис напрямую. То, что я предложил, - это тесты, тестирующие сервис напрямую, и тесты, которые макетируют эти сервисные вызовы. Если задание уходит, вы просто удалите связанные с ним тесты, и вы не потеряете покрытие тестов. Вроде долго думал, но вот как я подхожу к тестированию.

Другие вопросы по тегам