我如何在Grails中模拟域名但是通过其父项获取?

时间:2015-01-20 12:50:57

标签: grails groovy mocking subclass

我在我的grails应用程序中使用spring安全核心插件,默认情况下它创建了一个User类。我可以使用我的测试类上的@Mock([User])注释来模拟它。

在我的应用程序中,我有几种类型的用户,因此我创建了在应用程序本身中运行良好的子类型。

Subtype1 extends User
Subtype2 extends User

这在grails中处理完全正常,数据库也反映了这一点。然而,在我的代码中,我确实有一些方法可以被普通用户调用,所以我使用User.get(id),因为对于Subtype和Parent,id都是相同的。

如果我模拟User和Subtype,然后按如下所示创建Subtype对象

@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
    }
}

在未经测试的应用程序中,无论是否工作,当我嘲笑它时它会失败并且在我小时候创建时不会让我得到父母。

知道我做错了吗?

1 个答案:

答案 0 :(得分:0)

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

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