我如何在 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

知道我做错了什么吗?

看起来这在单元测试中是不可能的,无论是有意还是无意。

将测试编写为集成测试工作正常。