1

我在我的圣杯应用程序中使用 shiro 安全性。Grails 版本:2.2.1 shiro:1.2.0

我在为启用了过滤器的控制器编写 grails 单元测试用例时遇到问题。当测试用例在没有过滤器的情况下运行时,它工作正常,如果它与Filters 一起运行,那么它会因为在控制器中找不到 accessControl() 方法而失败。我不知道如何在运行测试用例时使 Shiro 的 api 可见。我参考了 shiro 单元测试用例链接http://shiro.apache.org/testing.html但我无法获得有关 accessControl() 的任何信息。我已经给出了我的类和测试用例的示例代码

MyController.groovy

def create() { 
            // getting request parameters and validation 
            String emailId = params.emailId 
            def ret = myService.createUser(emailId) 

            return ret 
 }

MyControllerFilters.groovy

def filters = { 
                loginCheck(controller: 'user') { 
                    before = { 
                            //do some business checks 

                            // Access control by convention. 
                            accessControl() // This is a dynamic method injected by ShiroGrailsPlugin to FilterConfig, but this is not visible during the test case. 
                        } 
                } 

MyControllerTests.groovy

@TestFor(MyController) 
@Mock(MyControllerFilters) 
class MyControllerTests { 

        @Before 
        void setup() { 
            // initializing some variables 
        } 

        void testCreateUserWithFilter() { 

            request.accessAllowed = true 

            withFilters(action:"create") { 
                    controller.create() 
            } 

            assert response.message == "success" 
        } 
    }
4

1 回答 1

0

尝试使用:

ControllerOrService.metaClass.method = {
    return "" //what you need to be returned
}

如果方法接受参数,则将参数添加到闭包:

 ControllerOrService.metaClass.method = { def a, def b ->
    return a + b
}

当你以这种方式模拟它们时,不要忘记使用方法的全名。

于 2013-09-09T11:51:47.960 回答