2016-07-30 10 views
0

Ich verwende Grails 3.1.9 und ich versuche zu verstehen, wie Sie Dienste testen. Hier ist meine Einheit:InvalidDataAccessResourceUsageException beim Testen eines Dienstes

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 = { 
    } 
} 

Und hier ist mein Service:

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

Und hier ist mein Test:

@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(*_) 
    } 
} 

Aber wenn ich Grails Test-App laufen lasse, erhalte ich die folgende Ausnahme im Bericht:

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) 

Was ich nicht verstehe, da es eine Eigenschaft "departureDate" auf der Entität "Flight" gibt.

+0

zu ermöglichen, dass die DB Sie zum Testen verwenden? H2 oder MySQL? –

+0

Ich verwende H2 zum Testen – Sebastien

+0

Haben Sie versucht, die Datenbank beim Testen auch auf MySQL zu ändern? –

Antwort

Verwandte Themen