1

我在尝试对服务类 api 进行单元测试时遇到问题

MyService.groovy

public int myMethod() {
  def cr = MyDomain.createCriteria()

  def myDomainCount = cr.count {
    isNull("column1")
  }

  return myDomainCount
}

MyTestClass.groovy

class MyTestClassTests extends GrailsUnitTestCase {

  void testMyCount() {

    mockDomain(MyDomain)

    myCriteria = [count :{Closure cls -> 10}]
    MyDomain.metaClass.static.createCriteria = {myCriteria}

    int cnt = new MyService().myMethod()

    assert 10 == cnt
  }
}

执行 myMethod() 时执行上述测试方法失败。上线失败

cr.count {
  isNull("column1")
}

我在执行期间得到的堆栈跟踪:

groovy.lang.MissingMethodException: No signature of method: com.MyService.isNull() is applicable for argument types: (java.lang.String) values: [column1]
 Possible solutions: findAll(), findAll(groovy.lang.Closure), is(java.lang.Object), isCase(java.lang.Object) at
 org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:55) at 
 org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:78) at
 org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)

cr.list注意:如果我在两个地方(服务类和测试类)都使用相同的测试用例,则可以正常工作。我不知道为什么它在计数期间失败??????!!!!!!

任何想法都会有很大帮助。在此先感谢。

4

1 回答 1

0

解决这个问题的两种方法:

1 - 只需创建实例

由于您可以模拟您的域类,因此创建与您的服务查询匹配的实例。

@TestFor(MyService)
@Mock(MyDomain)
class MyServiceTests {
  void testService() {
    MyDomain instance = new MyDomain(...)
    assert instance.save(flush:true)
    def count = service.myMethod()
    assert 1 == count
  }
}

2 - 模拟 grails.gorm.CriteriaBuilder

createCriteria()返回 的实例grails.gorm.CriteriaBuilder,您可以使用 GroovyMockFor更改 的行为count{}

@TestFor(MyService)
@Mock(MyDomain)
class MyDomainServiceTests {

  void testWithGroovyMock() {
    def mockedCriteria = new MockFor(CriteriaBuilder)
    mockedCriteria.demand.count(0..999) { Closure cls ->
      return 10
    }

    def count

    mockedCriteria.use {
      count = service.countWithIsNull()
    }

    assert 10 == count

  }

}

您可以在此处找到有关 Groovy MockFor 的更多信息。

另请注意,我正在使用 Grails 2.x 声明单元测试(注释)的方式。

于 2013-04-24T17:43:58.327 回答