我在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/