У меня есть интеграционный тест Grails, который распространяет GroovyTestCase
с двумя методами тестирования. Первый метод успешно не выполняется, но второй не может с groovy.lang.MissingMethodException
:Почему класс домена ведет себя по-разному в двух разных методах одного и того же GroovyTestCase?
Failure: testMapBudgetFailure (com.ross.budget.BudgetServiceTests)
groovy.lang.MissingMethodException: Нет подписи метода:
com.ross .budget.Budget.save() применим для типов аргументов:() значения: [] Возможные решения: save(), save (boolean), save (java.util.Map), wait(), last(), любой()
на com.ross.budget.BudgetServiceTests.testMapBudgetFailure (BudgetServiceTests.groovy: 45)
Даже при том, что тот же метод вызова b.save()
находится в первом методе. Если я комментирую первый метод, второй тест выполняется, как ожидалось. Почему два метода тестирования ведут себя по-другому?
Полный список класса:
package com.ross.budget
import grails.test.mixin.*
import org.junit.*
/**
* See the API for {@link grails.test.mixin.services.ServiceUnitTestMixin} for usage instructions
*/
@TestFor(BudgetService)
class BudgetServiceTests extends GroovyTestCase {
BudgetService budgetService
void testMapBudgetSuccess() {
Budget b = new Budget()
b.month = new Date(2012, 9, 1)
b.amount = new BigDecimal(10.0)
b.save()
Account a = new Account()
a.name = "Test"
a.institution = "Test"
a.description = "Test Account"
a.save()
Transaction t = new Transaction()
t.account = a
t.postDate = new Date(2012, 9, 5)
t.amount = 10.0
t.save()
boolean result = budgetService.mapTransaction(t)
assertTrue("Returned failed match.", result)
assertNotNull("No budget set", t.budget)
}
void testMapBudgetFailure() {
Budget b = new Budget()
b.month = new Date(112, 5, 1)
b.amount = new BigDecimal(10.0)
b.save()
Account a = new Account()
a.name = "Test"
a.institution = "Test"
a.description = "Test Account"
a.save()
Transaction t = new Transaction()
t.account = a
t.postDate = new Date(112, 6, 5)
t.amount = 10.0
t.save()
boolean result = budgetService.mapTransaction(t)
assertFalse("Returned match.", result)
assertNull("Budget set", t.budget)
}
}
Я знаю, что код является копией пасты и не мила. Это быстро испытанием для личного проекта
Насколько я понимаю из документов, вы должны либо использовать '@ TestFor', либо расширять его из' GroovyTestCase', а не как –
Очень странно, можете ли вы опубликовать код классов домена? –
работает, если вы удаляете аннотацию '@TestFor (...)'? –