在Grails中测试RESTful服务的方法有哪些?

时间:2014-06-04 05:59:05

标签: rest grails plugins tdd bdd

我不是Grails的新手,但我对它也不是很熟悉。我几乎要去学习。我注意到的一件事是,虽然Grails提供了对TDD / BDD的内置支持,但它缺乏关于它的重要文档。特别是,官方指南的REST部分没有说明如何测试RESTful服务。

我目前正在尝试使用Functional Testing Plugin创建的功能测试来测试我的代码。由于我在尝试通过GORM方法访问数据源时得到IllegalStateException,并且向域类添加@Mock并未改变任何内容,因此我不得不寻找解决方法。从我的网络搜索中,我发现可以使用Remote Control Plugin。但是,再一次,我在使用插件运行代码时得到InvalidClassException

所以我的测试逻辑就像,

  1. 点击数据源;检查没有记录。
  2. 向服务发出POST请求以创建记录。
  3. 再次点击数据源以检查记录是否已创建。
  4. 以下是步骤(1)中使用RemoteControlPlugin组件的示例代码。

    def recordCount = remote {
        //Position is a domain class
        Position.count
    }
    assertEquals 0, recordCount
    

    我得到了,

    | Failure: testCreatePosition(PositionFunctionalTests)
    |  groovyx.remote.client.RemoteException: An exception was raised in the remote application
        at groovyx.remote.client.RemoteControl.processResult(RemoteControl.groovy:129)
        at groovyx.remote.client.RemoteControl.exec(RemoteControl.groovy:73)
        at groovyx.remote.client.RemoteControl.exec(RemoteControl.groovy:67)
        at groovyx.remote.client.RemoteControl.call(RemoteControl.groovy:81)
        at PositionFunctionalTests.testCreatePosition(PositionFunctionalTests.groovy:21)
        at junit.framework.TestCase.runTest(TestCase.java:176)
        at junit.framework.TestCase.runBare(TestCase.java:141)
        at junit.framework.TestResult$1.protect(TestResult.java:122)
        at junit.framework.TestResult.runProtected(TestResult.java:142)
        at junit.framework.TestResult.run(TestResult.java:125)
        at junit.framework.TestCase.run(TestCase.java:129)
        at junit.framework.TestSuite.runTest(TestSuite.java:255)
        at junit.framework.TestSuite.run(TestSuite.java:250)
    Caused by: java.io.InvalidClassException: PositionFunctionalTests$_testCreatePosition_closure1; local class incompatible: stream classdesc serialVersionUID = 9199922008348880909, local class serialVersionUID = -8935356421602488910
        at groovyx.remote.server.CommandInvoker.instantiate(CommandInvoker.groovy:61)
        at groovyx.remote.server.CommandInvoker.invokeAgainst(CommandInvoker.groovy:37)
        at groovyx.remote.server.CommandChainInvoker.invokeAgainst(CommandChainInvoker.groovy:37)
        at groovyx.remote.server.Receiver.invokeCommandChain(Receiver.groovy:129)
        at groovyx.remote.server.Receiver.execute(Receiver.groovy:125)
        at groovyx.remote.transport.http.RemoteControlServlet.doExecute(RemoteControlServlet.groovy:74)
        at grails.plugin.remotecontrol.RemoteControlServlet.doExecute(RemoteControlServlet.groovy:30)
        at groovyx.remote.transport.http.RemoteControlServlet.doPost(RemoteControlServlet.groovy:39)
    

1 个答案:

答案 0 :(得分:0)

我也遇到了这个错误,以及我的某个域类看起来如何:

class Friend extends User implements Serializable {

    private static final long serialVersionUID = 5127248463279511859L

我相信我使用IDE来生成long。有关说明,请参阅here

另外,我在非分叉模式下运行我的功能测试。这可能会影响远程控制插件。我之前没有想到这一点。

grails.project.fork = [
    test: false,