grails - 如何在Grails中模拟域名但由其父级获取?

标签 grails groovy mocking subclass

我在grails应用程序中使用spring security core插件,默认情况下,它将创建一个User类。我可以在测试类上使用@Mock([User])注释对此进行模拟。

在我的应用程序中,我有几种类型的User,因此我创建了在应用程序本身中效果很好的子类型。

Subtype1 extends User
Subtype2 extends User

这在grails中很好地处理,数据库也反射(reflect)了这一点。但是,在我的代码中,确实有一些可由普通用户调用的方法,所以我使用User.get(id),因为子类型和父级的ID相同。

如果我模拟用户和子类型,然后按如下方式创建子类型对象
@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 的时候不会让我成为 parent 。

知道我在做什么错吗?

最佳答案

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

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

关于grails - 如何在Grails中模拟域名但由其父级获取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28045838/

相关文章:

java - 部署 tomcat webapp 时出错 | java.lang.IllegalStateException : ContainerBase. 添加子

Gradle:在多个子项目中包含相同的 SourceSet

python-3.x - python : How do I mock an async method that gets called multiple times?

grails - 查找今天更新的域实例

grails - 从Grails 1.3.6升级到2.1.1,插件发疯

mysql - 连接已经关闭

javascript - 单元测试 Sails JS 1.0 助手

ruby-on-rails - jRuby on Rails 与 Grails

java - Mac上的Android问题响应 native

go - 你如何在 Golang 中模拟一个类型中的一个类型?