如何解决Grails 4.0的Concordion测试
我正在尝试将Grails 3项目更新为Grails 4,但是我在Concordion测试中遇到问题。我必须模拟Gorm域以使用诸如domain.findby(...)
之类的功能进行服务测试。在Grails 3中,我为此使用了Mixin,但在Grails 4中,已弃用了Mixin,并由Spock代替。我不知道如何在没有使用Mixin的模拟Gorm的情况下运行测试。有没有办法让Concordion测试与Grails 4配合使用?
下面的代码是我在Grails 3中进行Concordion测试的简化示例。
域:
class Person {
Long id
String tlc
String firstname
String name
static constraints = {
tlc(nullable: false,blank: false)
firstname(nullable: false,blank: false)
name(nullable: false,blank: false)
}
static mapping = {
table 'person'
id column: 'person_id',generator: 'sequence',params: [sequence: 'PERSON_ID_SEQ']
tlc column: 'person_tlc'
firstname column: 'person_firstname'
name column: 'person_name'}
服务
class PersonService {
static transactional = true
int findAmountOfPersonsByName(String name) {
return Person.findAllByName(name).size()
}
Condorion测试:
import grails.gorm.transactions.Transactional
import grails.test.mixin.Mock
import grails.test.mixin.TestFor
import org.concordion.integration.junit4.ConcordionRunner
import org.junit.runner.RunWith
@Transactional
@TestFor(PersonService)
@Mock([Person])
@RunWith(ConcordionRunner.class)
class PersonTest {
PersonService personService
void setUp() {
personService = new PersonService()
}
void setPerson(String firstname,String name,String tlc) {
Person person = new Person(
name: name,tlc: tlc,firstname: firstname
).save(failOnError: true)
mockDomain(Person,[person])
}
}
Concordion HTML:
<html xmlns:concordion="http://www.concordion.org/2007/concordion">
<head>
<link href="concordion.css" rel="stylesheet" type="text/css"/>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
</head>
<body>
<h1>Person Test</h1>
<p concordion:execute="setUp()">Given Persons</p>
<table concordion:execute="setPerson(#firstname,#name,#tlc)">
<tbody>
<tr>
<th concordion:set="#firstname">First Name</th>
<th concordion:set="#name">Name</th>
<th concordion:set="#tlc">TLC</th>
</tr>
<tr>
<td>Tom</td>
<td>Smith</td>
<td>JSM</td>
</tr>
<tr>
<td>Steve</td>
<td>Miller</td>
<td>SMI</td>
</tr>
<tr>
<td>Adam</td>
<td>Smith</td>
<td>ASM</td>
</tr>
<tr>
<td>Anna</td>
<td>Johnson</td>
<td>AJO</td>
</tr>
</tbody>
</table>
<div class="example">
<h3>Test - Find Number of Persons</h3>
<table concordion:execute="#numberOfPersons = findAmountOfPersonsByName(#name)">
<tbody>
<tr>
<th concordion:set="#name">Name</th>
<th concordion:assertEquals="#numberOfPersons">NumberOfPersons</th>
</tr>
<tr>
<td>Smith</td>
<td>2</td>
</tr>
<tr>
<td>Miller</td>
<td>1</td>
</tr>
<tr>
<td>Johnson</td>
<td>1</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
重要的Gradle依赖项:
testCompile "org.grails:grails-web-testing-support:2.2.0.M1"
testCompile "org.grails:grails-test-mixins:3.3.0"
testCompile group: 'org.concordion',name: 'concordion',version: '2.2.0'
感谢您提出的所有好主意
解决方法
您所提供的服务如下所示:
class PersonService {
static transactional = true
int findAmountOfPersonsByName(String name) {
return Person.findAllByName(name).size()
}
}
注意::与问题没有直接关系,但顺便说一句,Person.findAllByName(name).size()
并不是一个好主意的原因之一是它正在检索每个{{1} },从具有指定Person
的数据库中创建所有这些对象,然后对它们进行后处理,然后对它们进行计数。一个更好的主意是让数据库进行计数。例如,name
将一个查询发送到数据库,类似于Person.countByName(name)
,这将大大提高效率。
使用最新版本的GORM,这样的服务会更有意义...
SELECT COUNT(*) FROM PERSON WHERE NAME = ?
请注意,这只是一个接口,因此您可以在想要提供模拟实现的任何地方轻松注入该接口的其他实现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。