我如何在 Grails 中模拟域但通过它的 Parent 获取它?
How do I mock a domain in Grails but get it by its Parent?
我在我的 grails 应用程序中使用 spring 安全核心插件,默认情况下它会为我创建一个用户 class。我可以在我的测试 class.
中使用 @Mock([User]) 注释来模拟它
在我的应用程序中,我有多种用户类型,因此我创建了在应用程序本身中运行良好的子类型。
Subtype1 extends User
Subtype2 extends User
这在 grails 中处理得非常好,数据库也反映了这一点。然而,在我的代码中,我确实有一般用户可以调用的方法,所以我使用 User.get(id) 因为子类型和 Parent.
的 id 相同
如果我模拟 User 和 Subtype 然后创建一个 Subtype object 如下
@TestFor(MyController)
@Mock([Subtype1,User])
class MyControllerSpec extends Specification {
def test_methodName() {
setup:
Subtype1 sub = new Subtype1(username:"blah",password:"blah",.....).save()
when:
controller.methodName(sub.id)
then:
//Some tests here
}
然后对下面的代码进行注释以显示结果
class MyController() {
methodName(long id) {
User user = User.get(id) //This returns null
Subtype1 sub = Subtype1.get(id) //This works
}
}
在应用程序中,当未经过测试时,两者都有效,但是当我模拟它们时,它失败了,并且在创建为 child.
时不让我得到 parents
知道我做错了什么吗?
看起来这在单元测试中是不可能的,无论是有意还是无意。
将测试编写为集成测试工作正常。
我在我的 grails 应用程序中使用 spring 安全核心插件,默认情况下它会为我创建一个用户 class。我可以在我的测试 class.
中使用 @Mock([User]) 注释来模拟它在我的应用程序中,我有多种用户类型,因此我创建了在应用程序本身中运行良好的子类型。
Subtype1 extends User
Subtype2 extends User
这在 grails 中处理得非常好,数据库也反映了这一点。然而,在我的代码中,我确实有一般用户可以调用的方法,所以我使用 User.get(id) 因为子类型和 Parent.
的 id 相同如果我模拟 User 和 Subtype 然后创建一个 Subtype object 如下
@TestFor(MyController)
@Mock([Subtype1,User])
class MyControllerSpec extends Specification {
def test_methodName() {
setup:
Subtype1 sub = new Subtype1(username:"blah",password:"blah",.....).save()
when:
controller.methodName(sub.id)
then:
//Some tests here
}
然后对下面的代码进行注释以显示结果
class MyController() {
methodName(long id) {
User user = User.get(id) //This returns null
Subtype1 sub = Subtype1.get(id) //This works
}
}
在应用程序中,当未经过测试时,两者都有效,但是当我模拟它们时,它失败了,并且在创建为 child.
时不让我得到 parents知道我做错了什么吗?
看起来这在单元测试中是不可能的,无论是有意还是无意。
将测试编写为集成测试工作正常。