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