【问题标题】:Grails inject services into domains during unit tests 2.4.xGrails 在单元测试 2.4.x 期间将服务注入域
【发布时间】:2015-09-06 17:10:32
【问题描述】:

这是一个包含简单 springSecurityService 的域类

class Login {

  def springSecurityService

  String username
  String password

  boolean enabled;
  boolean accountExpired;
  boolean accountLocked;
  boolean passwordExpired;

  static constraints = {
    username blank: false, unique: true
    password blank: false
  }

  def beforeInsert() {
    encodePassword()
  }

  def beforeUpdate() {
    if (isDirty('password')) {
        encodePassword()
    }
  }

  protected void encodePassword() {
    password = springSecurityService.encodePassword(password)
  }

}

简单的单位规范

import grails.plugin.springsecurity.SpringSecurityService
import grails.test.mixin.TestFor
import grails.test.mixin.TestMixin
import grails.test.mixin.support.GrailsUnitTestMixin
import spock.lang.Specification

@TestFor(Login)
@TestMixin(GrailsUnitTestMixin)
class LoginSpec extends Specification {

  def setup() {
    defineBeans {
        springSecurityService(SpringSecurityService)
    }
  }

  def cleanup() {
  }

  void "test service injected in domain"() {
    given:''

    when:''
    Login l = new Login()


    then:''
    applicationContext.getBean("springSecurityService") != null
    // fails
    l.springSecurityService != null
  }
}

我想测试一个简单的 Login.save(),但意识到 springSecurityService 没有被注入,所以想了解将服务注入域对象以进行单元测试的最佳方法。

有什么想法、建议吗?

【问题讨论】:

    标签: unit-testing grails


    【解决方案1】:

    您始终可以模拟 springSecurityService 或仅模拟 encodePassword 方法。

    另一种方法是使用集成测试。

    【讨论】:

    • 我可以明确分配“l.springSeurityService = applicationContext.getBean("springSecurityService")”。如果这些可以从“defineBeans”部分中定义的 bean 自动装配,那将是理想的。
    猜你喜欢
    • 2012-08-31
    • 1970-01-01
    • 2016-09-05
    • 2020-11-20
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多