鉴于我是 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)]
最佳答案
你的开头这么高:
I want to test if the users are created and stored properly through GORM. Here the integration test:
但随后一切都变得一团糟,因为您使用的单元测试假装是集成测试,更糟糕的是,您正在使用单元测试测试持久性。
使用集成测试来测试持久性。仅当单元测试对您正在测试的内容有意义时才使用域类模拟,并且您希望强制域层以某种方式响应,以便您可以专注于 Controller /服务/等。正在测试中。
使用集成测试,它至少配置一个 H2 数据库,具有完整的 ACID 支持、行锁定、真正的 SQL 查询等。如果您愿意,可以将其切换为测试 Oracle 模式、MySQL 数据库等。但是您的测试运行真实的查询和更新。如果您使用模拟来测试持久性,那么您实际上只是在测试模拟。
集成测试不使用混合、模拟等。有一个真正的 Spring ApplicationContext、Hibernate(或您正在使用的任何 GORM)、加载插件等。使用 JUnit 3(扩展 GroovyTestCase
) 或 JUnit 4(无基类,使用 JUnit 注释)或 Spock。请注意,集成测试将每个测试运行配置为在一个事务中发生,并且在成功测试结束时或在测试失败时更早回滚,但无论哪种情况,测试之间都没有结转。
如果您想使用 Spock(并且您应该),则扩展 grails.test.spock.IntegrationSpec
以获取默认为 Spock 测试的较新版本的 Grails。在旧版本中,安装 spock 插件并使用插件的集成基类。
关于Grails 测试工厂类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26533105/