【问题标题】:Grails unit test failing in Grails 2.xGrails 2.x 中的 Grails 单元测试失败
【发布时间】:2014-02-14 15:43:33
【问题描述】:

我们有一个类,它使用 Groovy 的 invokeMethod 拦截器来拦截类上的所有静态方法调用。它用于定义从数据库中提取的规则。最近,我们从 1.3.7 升级到 Grails 2.3.4,如果我调用一个已经定义的方法,测试这个类的单元测试现在会失败。如果尚未定义该方法,它可以正常工作。这是我们正在做的一个非常简化的版本。

class TestUtil {
static {

    TestUtil.metaClass.'static'.invokeMethod = { String m_name, args ->

        def method = TestUtil.metaClass.getMetaMethod(m_name, args)
        if(!method) {
            //define it
            TestUtil.metaClass.'static'."${m_name}" = { argz ->
                return argz[0]
            }
        }

        //call it
        "${m_name}"(args)
        }
    }
}

class TestUtilTest extends GrailsUnitTestCase {
void testMethodNotExist() {
    def result = TestUtil.testMethod("not exist")

    assertEquals result, "not exist"
}

void testExistingMethod() {
    def result = TestUtil.testMethod("exist")

    assertEquals result, "exist"
}
}

我得到的错误是:| groovy.lang.MissingMethodException:没有方法签名:静态 TestUtil.testMethod() 适用于参数类型:(java.lang.String) 值:[exist]

当在应用程序的上下文中使用时,代码运行良好……只是单元测试出错了,我不太明白为什么。

【问题讨论】:

  • 不确定这是否是问题所在,但您不应该打电话给TestUtil.metaClass.getStaticMetaMethod 而不仅仅是getMetaMethod吗?

标签: unit-testing grails groovy


【解决方案1】:

哇,从 1.3.7 到 2.3.4……人类的巨大飞跃。 :)

由于扩展 GrailsUnitTestCase,您会收到错误消息。

如果您没有在 util 类的测试中进行任何类型的模拟,那么您可以修改测试类以扩展 GroovyTestCase 而不是 GrailsUnitTestCase。它应该可以工作。

GrailsUnitTestCase 不鼓励在较新版本的 Grails 中使用。在 Grails 2.3.4 中,当您从命令行创建测试或创建任何人工制品时,默认情况下会得到 spock,如果您使用 spock 测试,您也不应该看到任何问题,如下所示:

import spock.lang.Specification

class TestUtilSpec extends Specification {

    void "test both in one test case"(){
        expect:
            result == TestUtil.testMethod(arg)

        where:
            arg         || result
            "not exist" || "not exist"
            "exist"     || "exist"
    }
}

【讨论】:

  • Grails 2.3.4 测试默认使用 JUnit。如果您像示例中那样扩展 Specification,他们只会使用 Spock
  • Grails 2.3.4 创建 spock Specification 特别是当您使用 create-unit-test/create-integration-test 或任何其他人工制品“创建”测试时,我的意思是。 :) @唐
  • 你是对的。我不知道,因为我从不使用这些命令。尽管如此,我怀疑 OP 是否想将他的测试从 JUnit 迁移到 Spock 只是为了解决这个问题,但我同意他应该停止扩展 GrailsUnitTestCase
  • 我确实尝试过不扩展 GrailsUnitTestCase,但我仍然遇到同样的问题。运行测试时,环境肯定有问题,因为当我运行应用程序本身并使用相同的代码时,它肯定可以正常工作。
  • @user1895955 你不是继承了 GroovyTestCase 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多