gpt4 book ai didi

unit-testing - @TestFor 在域的单元测试中做了什么?

转载 作者:行者123 更新时间:2023-12-02 14:00:48 25 4
gpt4 key购买 nike

在为 Grails 3 中的某个类编写单元测试时,我可以使用 @TestFor注释来指定我要测试的类。在我的单元测试中,如果我的被测类是 Controller ,则我有一个字段“ Controller ”,如果我正在测试服务,则有一个字段“服务”,我可以将这些字段用作“被测系统”。

我想知道 @TestFor正在测试域类以及它应该如何使用。我找不到任何处理这种情况的文件。假设我有一个域“MyDomain”和一个测试“MyDomainSpec”,其开头如下:

@TestFor(MyDomain)
class MyDomainSpec extends Specification {

def setup() {
def doesntMatter = domain // just to check access to "domain"

最后一行已经给了我一个

org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'class MyDomain' with class 'java.lang.Class' to class 'MyDomain'



这可能意味着 Grails 尝试使用表示 MyDomain 类的对象作为此类的实例。我想知道为什么会发生这种情况以及代码有什么问题?我的意思是, domain属性(property)存在,它是有原因的,还是不是?如何使用仅在访问时引发异常的属性?

更新
显然,仅当域类具有字段 String name 时才会引发异常在里面。我不知道这个领域有什么特别之处。它可能只是一个错误吗?

最佳答案

@TestFor注解为 Grails 域类做了很多事情,但最重要的是它模拟了域的行为和 GORM 功能,并提供了一个返回域类实例的 getter。

域类注册为原型(prototype) Spring bean,因此 getter 只需向应用程序上下文询问新实例,然后将该实例设置为私有(private) $domain在后续调用 getter 时返回的字段。请注意,您的 def doesntMatter = domain正在使用这个生成的 getter,相当于 def doesntMatter = getDomain()在哪里 getDomain()返回 MyDomain 的新实例.

听起来你的假设是正确的。调用 getter 不应导致异常。以下工作正常:

@TestFor(MyDomain)
class MyDomainSpec extends Specification {

void "a new domain can be saved"() {
given: "a new instance of MyDomain"
def d = domain // or getDomain()

expect:
d.id == null

when:
d.save()

then:
d.id != null
}
}

@Entity
class MyDomain {

}

编辑:
这与 Grails 中的一个错误有关,应该在下一个版本中修复,请参阅 https://github.com/grails/grails-core/issues/10363 .

关于unit-testing - @TestFor 在域的单元测试中做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41163680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com