鉴于我是关于grails的新手,我试图测试工厂类。 Factory类位于src文件夹中,因为我不希望它作为服务。
class UserFactory {
static Map userDefaults = [
email : 'usermail@test.it',
alias : 'myalias',
firstName : 'Antonio',
lastName : 'Roma',
password : 'asdhjs',
placeOfBirth : 'Milan',
placeOfResidence: 'Berlin',
dateOfBirth : new Date() - 4000
]
static User build(Map properties, Map options = [persisted: true]) {
userDefaults.putAll properties
def user = new User(userDefaults)
if (options.persisted) { user.save() }
return user
}
static Collection<User> build(Collection<Map> properties, Map options = [persisted: true]) {
properties.collect { build(it, options) }
}
}
我想测试用户是否通过GORM正确创建和存储。这里集成测试:
@TestMixin(DomainClassUnitTestMixin)
class UserFactoryIntegrationSpec extends Specification {
def setup() {
mockDomain(User)
}
def cleanup() {
}
void "create user"() {
when:
User user = UserFactory.build([alias: 'xx', email: 'xx@gmail.com'])
then:
User.count() == 1
user.alias == 'xx'
user.email == 'xx@gmail.com'
user.id != null
}
void "create users"() {
when:
Collection<User> users = UserFactory.build([[alias: 'xx', email: 'xx@gmail.com'], [alias: 'yy', email: 'yy@gmail.com']])
then:
users.size() == 2
users.alias == ['xx', 'yy']
users.email == ['xx@gmail.com','yy@gmail.com']
users.id != [null, null]
}
}
用户没有存储,我猜GORM没有正确加载...我错过了一些注释吗?!这里是测试应用程序集成的结果:UserFactoryIntegrationSpec
User.count() == 1
| |
0 false
users.id != [null, null]
| | |
| | false
| [null, null]
[rigel.resources.User : (unsaved), rigel.resources.User : (unsaved)]
答案 0 :(得分:2)
你开始如此高调:
然而,由于你正在使用假装是集成测试的单元测试,所以这一切都变得很糟糕了,更糟糕的是,你用单元测试来测试持久性。我想测试用户是否通过正确创建和存储 GORM。这里集成测试:
使用集成测试来测试持久性。只有在单元测试对您正在测试的内容有意义时才使用域类模拟,并且您希望强制域层以特定方式响应,以便您可以专注于控制器/服务/等。正在接受测试。
使用集成测试,它至少配置一个H2数据库,具有完整的ACID支持,行锁定,真正的SQL查询等。如果您愿意,可以将其切换为测试Oracle模式,MySQL数据库等等。但是您的测试会运行真实的查询和更新。如果你使用模拟来测试持久性,那么你真的只是测试模拟。
集成测试不使用mixins,模拟等。有一个真正的Spring ApplicationContext,Hibernate(或你正在使用的任何GORM),插件加载等。使用JUnit 3(扩展) GroovyTestCase
)或JUnit 4(没有基类,使用JUnit注释)或Spock。请注意,集成测试将每个测试运行配置为在事务中发生,并且如果测试失败,则在成功测试结束时或之前回滚,但在任何一种情况下,测试之间都没有遗留。
如果你想使用Spock(你应该),那么为新版本的Grails扩展grails.test.spock.IntegrationSpec
,默认为Spock测试。在旧版本中,安装spock插件并使用插件的集成基类。