grails - 模拟标准计数api grails/groovy

标签 grails groovy mocking

尝试对服务类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")
}

我在执行过程中得到的stacktrace:
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,则相同的测试用例可以正常工作。我不知道为什么计数失败?

任何想法都会有很大帮助。

最佳答案

解决此问题的两种方法:

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的实例,可以使用Groovy MockFor更改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 here的更多信息。

还要注意,我使用的是Grails 2.x声明单元测试(注释)的方法。

关于grails - 模拟标准计数api grails/groovy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16196448/

相关文章:

grails - 从其基本类型创建一个 super 对象(Grails)

grails - 如果参数文本为ASCII,则将Grails空间解码为加号

grails - 每个开发人员模式的编辑都会添加同一类的另一个Controller实例吗?

java - 在 Netbeans 6.9.1 中验证 Java 类库

embedded - 一组一致且简单的IDE和用于C++的嵌入式代码和单元测试的工具?

grails - 使用Grails错误error.gsp和GrailsWrappedRuntimeException错误

security - 在 Groovy 动态 SQL 中检测 SQL 注入(inject)

elasticsearch - 如何将脚本化度量标准中的Elasticsearch字段的类型从Long更改为Double?

java - Thread.sleep 没有被 PowerMockito mock

java - 如何在 Mockito 测试中从 application.properties 加载属性