【发布时间】:2015-11-30 20:23:56
【问题描述】:
我的问题是:我是 Spock 测试的新手,并且正在尝试在此用户类上获得 100% 的代码覆盖率。为了让我开始,有人可以帮我弄清楚如何测试构造函数。我目前没有使用 cobertura 插件覆盖它。此外,如果有人了解 Spock + Cobertura,也许您可以阐明我做错了什么,并为进一步测试提供一些指导。
我有一个代表用户的类:
import java.io.Serializable;
import java.util.Set;
class User implements Serializable {
String email
byte[] photo
static hasMany = [lineups: Lineup]
private static final long serialVersionUID = 1
transient springSecurityService
String username
String password
boolean enabled = true
boolean accountExpired
boolean accountLocked
boolean passwordExpired
User(String username, String password) {
this()
this.username = username
this.password = password
}
@Override
int hashCode() {
username?.hashCode() ?: 0
}
@Override
boolean equals(other) {
is(other) || (other instanceof User && other.username == username)
}
Set<SecRole> getAuthorities() {
SecUserSecRole.findAllBySecUser(this)*.secRole
}
def beforeInsert() {
encodePassword()
}
def beforeUpdate() {
if (isDirty('password')) {
encodePassword()
}
}
protected void encodePassword() {
password = springSecurityService?.passwordEncoder ? springSecurityService.encodePassword(password) : password
}
static transients = ['springSecurityService']
static constraints = {
username blank: false, unique: true
password blank: false
email(unique: true, blank: false, nullable: true) // needs to be moved to account
photo(nullable:true, maxSize: 1024 * 1024 * 2 /* 2MB */)
}
static mapping = {
password column: '`password`'
}
String toString() {
return id + ": " + email + " " + username
}
}
然后我有一个 Spock 单元测试:(不是我所有的代码都在这里,但只是为了我请求信息的示例......
@TestFor(User)
class UserSpec extends Specification {
User user
def setup() {
user = new User(
username: "fredflintstone",
password: "Wilma1",
enabled: true).save(failOnError: true, flush: true)
}
def cleanup() {
user = null
}
// Constructor tests
void "test to check constructor works"() {
when:
mockForConstraintsTests(User, [user])
expect:
user.validate()
user != null
user.username != null
user.password != null
}
void "test #hashCode works"() {
setup:
mockForConstraintsTests(User, [user])
expect:
user.username.hashCode() != null
}
}
【问题讨论】:
-
100% 的测试覆盖率可能过于困难,而且意义不大,尤其是像 Groovy 这样可能还有其他因素在起作用的语言。一般来说,如果你能在没有太多痛苦的情况下达到 80-90%,那么你就做得很好……除此之外,你的收益可能会递减。
-
100% 的测试覆盖率通常让我认为人们专注于实现 100%,而不是他们考虑测试的内容和原因
标签: unit-testing grails groovy spock cobertura