Grails 2.4.4覆盖springSecurityService

时间:2018-10-17 16:08:49

标签: grails spring-security integration-testing cobertura

我有grails 2.4.4和Cobertura作为秘密测试。我有以下代码要测试:

def viewMailTemplates(){
    User user = User.findByEmail(springSecurityService.authentication.principal)
    def token = user.activationToken
    def urlActivacion = request.getScheme() + '://' + request.getServerName() +":"+ request.getServerPort() + createLink(controller: "user", action: "activation", params: [token: token])

    def srcImage = request.getScheme() + '://' + request.getServerName() +":"+ request.getServerPort()+ "/assets/logoOlu.jpg"
    render(view: 'mailTemplates/_activationES', model: [srcImage: srcImage, urlActivacion: urlActivacion])
}

我有这个测试:

@TestMixin(GrailsUnitTestMixin)
@TestFor( UserController )
@Mock([UserController, User])

class UserControllerSpec extends Specification {

 void "Test the viewMailTemplates action returns the correct model"() {
      when: "The viewMailTemplates action is executed"
        controller.viewMailTemplates()
        then: "The model is correct"
        status == 405
        }

但是问题是测试模式无法访问数据库并通过此测试,因为springSecurityService = null

如果我执行“ User.get(1)”之类的操作,则结果为null,即使我有该用户,并且该程序(正在开发中)也可以通过Mysql在localhost中的数据库正常工作

我如何通过此考试?如何为此测试创建一个新的springSecurityService?

2 个答案:

答案 0 :(得分:1)

根据设计,单元测试不会连接到数据库,而是模拟内存中域的存储。 (另一方面,集成测试确实可以连接到真实的数据库。)

对于每个单元测试,您必须“手动”保存测试所需的实例。为避免重复,您可以使用setup方法并将该实例保存在类中的所有测试中。

最后,您可以按照Mike W的建议模拟SpringSecurityService

@TestMixin(GrailsUnitTestMixin)
@TestFor( UserController )
@Mock([UserController, User])

class UserControllerSpec extends Specification {

    def setup() {
        new User(username:'test', email:'demo@test.com').save(flush:true)
        assert User.count() == 1

        controller.springSecurityService = [authentication:[principal: 'demo@test.com']]
    }

    void "Test the viewMailTemplates action returns the correct model"() {
        when: "The viewMailTemplates action is executed"
            controller.viewMailTemplates()
        then: "The model is correct"
            status == 405
    }
}

答案 1 :(得分:0)

您可以仅使springSecurityService成为类似以下地图的地图:

void "Test the viewMailTemplates action returns the correct model"() {
    given:
        controller.springSecurityService = [authentication:[principal: 'email_address_of_user_in_db']]
    when:
         controller.viewMailTemplates()
    then: "The model is correct"
        status == 405
}