Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何测试利用条件查询(使用spock)的Grails服务?_Unit Testing_Hibernate_Grails_Junit_Spock - Fatal编程技术网

Unit testing 如何测试利用条件查询(使用spock)的Grails服务?

Unit testing 如何测试利用条件查询(使用spock)的Grails服务?,unit-testing,hibernate,grails,junit,spock,Unit Testing,Hibernate,Grails,Junit,Spock,我正在尝试测试一个简单的服务方法。该方法主要只是返回一个条件查询的结果,我想测试它是否返回一个结果(取决于查询的内容) 问题是,我不知道如何正确地修改相应的测试。我试图通过spock来完成它,但是用其他任何测试方法来完成同样的操作也失败了 您能告诉我如何修改测试以使其适用于手头的任务吗? (顺便说一句,如果可能的话,我想保持一个单元测试。) 事件服务方法 public HashSet<Event> listEventsForDate(Date date, int offset, in

我正在尝试测试一个简单的服务方法。该方法主要只是返回一个条件查询的结果,我想测试它是否返回一个结果(取决于查询的内容)

问题是,我不知道如何正确地修改相应的测试。我试图通过spock来完成它,但是用其他任何测试方法来完成同样的操作也失败了

您能告诉我如何修改测试以使其适用于手头的任务吗?

(顺便说一句,如果可能的话,我想保持一个单元测试。)

事件服务方法

public HashSet<Event> listEventsForDate(Date date, int offset, int max) {
    date.clearTime()

    def c = Event.createCriteria()
    def results = c {
        and {
            le("startDate", date+1) // starts tonight at midnight or prior?
            ge("endDate", date)     // ends today or later?
        }
        maxResults(max)
        order("startDate", "desc")
    }
    return results
}
错误

groovy.lang.MissingMethodException: No signature of method: static myapp.Event.createCriteria() is applicable for argument types: () values: []
    at myapp.EventService.listEventsForDate(EventService.groovy:47)
    at myapp.EventServiceSpec.list the Events of a specific date(EventServiceSpec.groovy:29)

单元测试中不支持条件查询。从:

[T] 该插件不支持模拟条件或HQL查询。如果使用这两种方法中的任何一种,只需手动模拟相应的方法(例如使用mockFor())或使用真实数据的集成测试

您必须使您的测试成为集成测试。如果将测试从test/unit文件夹移动到test/integration文件夹,您将看到异常消失


在单元测试中有一些关于标准支持的工作正在进行,如果您觉得有冒险精神,您可以今天就尝试一下。看看这个。

您不应该使用单元测试来测试持久性-您只是在测试模拟框架

相反,将条件查询移动到域类中适当命名的方法,并使用集成测试对数据库进行测试:

class Event {
   ...
   static Set<Event> findAllEventsByDay(Date date, int offset, int max) {
      ...
   }
}

class EventService {

   Set<Event> listEventsForDate(Date date, int offset, int max) {
      ...
      return Event.findAllEventsByDay(date, offset, max)
   }
}
这是合适的,因为您正在测试服务如何使用它接收的数据,并假设集成测试中包含了检索

class Event {
   ...
   static Set<Event> findAllEventsByDay(Date date, int offset, int max) {
      ...
   }
}

class EventService {

   Set<Event> listEventsForDate(Date date, int offset, int max) {
      ...
      return Event.findAllEventsByDay(date, offset, max)
   }
}
def events = [new Event(...), new Event(...), ...]
Event.metaClass.static.findAllEventsByDay = { Date d, int offset, int max -> events }