【问题标题】:InvalidDataAccessResourceUsageException when testing a service测试服务时出现 InvalidDataAccessResourceUsageException
【发布时间】:2016-07-30 05:21:33
【问题描述】:

我正在使用 Grails 3.1.9,并且正在尝试了解如何测试服务。这是我的实体:

class Flight {
    String number
    Plane plane
    Airport origin
    Airport destination
    LocalDate departureDate
    LocalTime departureTime
    LocalDate arrivalDate
    LocalTime arrivalTime
    BigDecimal ticketPrice
    boolean cancelled

    static hasMany = [
        bookings: Booking
    ]

    static constraints = {
    }
}

这是我的服务:

@Transactional
class FlightService {
    List<Flight> search(Airport from, Airport to, LocalDate on) {
        return Flight.findAllByOriginAndDestinationAndDepartureDate(from, to, on)
    }
}

这是我的测试:

@TestFor(FlightService)
@Mock([Flight])
class FlightServiceSpec extends Specification {

    def setup() {
    }

    def cleanup() {
    }

    void "test search"() {
        when:
            def sfo = new Airport(code: 'SFO', city: 'San Francisco', countryCode: 'US', timeZone: ZoneId.of("America/Los_Angeles"))
            def bru = new Airport(code: 'BRU', city: 'Brussels', countryCode: 'BE', timeZone: ZoneId.of("Europe/Brussels"))
            service.search(bru, sfo, LocalDate.of(2016, 8, 31))
        then:
            1 * Flight.findAllByOriginAndDestinationAndDepartureDate(*_)
    }
}

但是当我运行 grails test-app 时,报告中出现以下异常:

org.springframework.dao.InvalidDataAccessResourceUsageException: Cannot query [com.epseelon.atr.Flight] on non-existent property: departureDate
at org.grails.datastore.mapping.simple.query.SimpleMapQuery.getValidProperty(SimpleMapQuery.groovy:751)
at org.grails.datastore.mapping.simple.query.SimpleMapQuery.executeSubQueryInternal(SimpleMapQuery.groovy:690)
at org.grails.datastore.mapping.simple.query.SimpleMapQuery.executeSubQuery(SimpleMapQuery.groovy:676)
at org.grails.datastore.mapping.simple.query.SimpleMapQuery.executeQuery(SimpleMapQuery.groovy:63)
at org.grails.datastore.mapping.query.Query.list(Query.java:567)
at org.grails.datastore.gorm.finders.FindAllByFinder.invokeQuery(FindAllByFinder.java:49)
at org.grails.datastore.gorm.finders.FindAllByFinder$1.doInSession(FindAllByFinder.java:43)
at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:310)
at org.grails.datastore.gorm.finders.AbstractFinder.execute(AbstractFinder.java:41)
at org.grails.datastore.gorm.finders.FindAllByFinder.doInvokeInternal(FindAllByFinder.java:40)
at org.grails.datastore.gorm.finders.DynamicFinder.invoke(DynamicFinder.java:157)
at org.grails.datastore.gorm.finders.DynamicFinder.invoke(DynamicFinder.java:357)
at org.grails.datastore.gorm.GormStaticApi.methodMissing(GormStaticApi.groovy:141)
at org.grails.datastore.gorm.GormEntity$Trait$Helper.staticMethodMissing(GormEntity.groovy:745)
at com.epseelon.atr.FlightService.$tt__search(FlightService.groovy:11)
at com.epseelon.atr.FlightService.search_closure1(FlightService.groovy)
at groovy.lang.Closure.call(Closure.java:414)
at groovy.lang.Closure.call(Closure.java:430)
at grails.transaction.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:96)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at grails.transaction.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:93)
at com.epseelon.atr.FlightServiceSpec.test search(FlightServiceSpec.groovy:27)

我不明白,因为 Flight 实体上有一个离开日期属性。

【问题讨论】:

  • 您使用哪个数据库进行测试? H2 还是 MySQL?
  • 我正在使用 H2 进行测试
  • 您是否尝试过在测试时也将数据库更改为 MySQL?

标签: grails grails-orm spock


【解决方案1】:

将此添加到您的规范中以启用 joda 时间单元测试支持

def setupSpec() {
    SimpleMapJodaTimeMarshaller.initialize();
}

https://github.com/gpc/joda-time/issues/14

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-06
    • 1970-01-01
    • 2018-10-18
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2016-02-13
    相关资源
    最近更新 更多