class 的模拟在 Spock 测试用例中不起作用
Mocking of class is not working in Spock Test case
我正在尝试为 Rest Post 方法编写一个测试用例,该方法获取请求对象,转换为域对象并使用 spring jpa 存储库保存对象。
文件夹结构:
core.jar - 域、存储库和 daos
core.war - 服务、spock 测试、控制器。 core.jar 是部分依赖 jar
示例请求:
public class RequestObject {
private Long value2;
private Long value1;
... getters and setters
}
域对象
public class DomainObject {
private Object object1;
private Object object2;
private type field1;
private type field2;
private long version;
private date datecreated
... getters and setters
}
服务方式
@Autowired
DomainDAO domainDAO; // DomainDAO has domainRepository Autowired
@RequestMapping( value = "/domain", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE )
public DomainObject saveDomainObject(@RequestBody RequestObject request)
{
return domainDAO.saveDomain(buildDomainObject(request))
}
private DomainObject buildDomainObject(RequestObject request)
{
DomainObject object = new DomainObject()
object.setField1(request.getValue2());
etc ....
}
如果我对数据库使用 REST Client/SOAP/Swagger,我将成功 save/update。但是当我尝试用模拟编写 spock 测试用例时,我遇到了以下错误
测试用例
void "saveDomainObject success"() {
setup:
1 * domainDAO.saveDomain(domainObject) >> {DomainObject}
Gson gson = new Gson();
String json = gson.toJson(domainRequest);
when:
def resp = mockMvc.perform(post("/domain")
.contentType(MediaType.APPLICATION_JSON_VALUE)
.content(json)).andReturn().response
def content = new JsonSlurper().parseText(resp.contentAsString)
then:
println content
}
错误信息
Too few invocations for:
1 * domainDAO.saveDomain(domainObject) >> {DomainObject} (0 invocations)
Unmatched invocations (ordered by similarity):
1 * domainDAO.saveDomain(com.test.core.domain.DomainObject@6f27c0ef)
at org.spockframework.mock.runtime.InteractionScope.verifyInteractions(InteractionScope.java:78)
at org.spockframework.mock.runtime.MockController.leaveScope(MockController.java:76)
at com.test.core.rest.service.DomainServiceServiceSpec.saveDomainObject success(DomainServiceSpec.groovy:132)
我在使用保存对象进行测试时遇到问题,我尝试了多个选项但仍然遇到相同的错误。我怀疑这是因为域对象在不同的 jar 中,有人可以帮我解决这个问题吗?
谢谢
当您指定 saveDomain(domainObject)
时,您是在告诉 Spock 期望使用 domainObject
中的值作为参数调用该方法 。但是,在您的代码中,您正在创建一个新的 DomainObject
并将 that 传递给您的模拟。这就是我想你想要的:
1 * domainDAO.saveDomain(_ as DomainObject) >> { it[0] }
我正在尝试为 Rest Post 方法编写一个测试用例,该方法获取请求对象,转换为域对象并使用 spring jpa 存储库保存对象。
文件夹结构:
core.jar - 域、存储库和 daos core.war - 服务、spock 测试、控制器。 core.jar 是部分依赖 jar
示例请求:
public class RequestObject {
private Long value2;
private Long value1;
... getters and setters
}
域对象
public class DomainObject {
private Object object1;
private Object object2;
private type field1;
private type field2;
private long version;
private date datecreated
... getters and setters
}
服务方式
@Autowired
DomainDAO domainDAO; // DomainDAO has domainRepository Autowired
@RequestMapping( value = "/domain", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE )
public DomainObject saveDomainObject(@RequestBody RequestObject request)
{
return domainDAO.saveDomain(buildDomainObject(request))
}
private DomainObject buildDomainObject(RequestObject request)
{
DomainObject object = new DomainObject()
object.setField1(request.getValue2());
etc ....
}
如果我对数据库使用 REST Client/SOAP/Swagger,我将成功 save/update。但是当我尝试用模拟编写 spock 测试用例时,我遇到了以下错误
测试用例
void "saveDomainObject success"() {
setup:
1 * domainDAO.saveDomain(domainObject) >> {DomainObject}
Gson gson = new Gson();
String json = gson.toJson(domainRequest);
when:
def resp = mockMvc.perform(post("/domain")
.contentType(MediaType.APPLICATION_JSON_VALUE)
.content(json)).andReturn().response
def content = new JsonSlurper().parseText(resp.contentAsString)
then:
println content
}
错误信息
Too few invocations for:
1 * domainDAO.saveDomain(domainObject) >> {DomainObject} (0 invocations)
Unmatched invocations (ordered by similarity):
1 * domainDAO.saveDomain(com.test.core.domain.DomainObject@6f27c0ef)
at org.spockframework.mock.runtime.InteractionScope.verifyInteractions(InteractionScope.java:78)
at org.spockframework.mock.runtime.MockController.leaveScope(MockController.java:76)
at com.test.core.rest.service.DomainServiceServiceSpec.saveDomainObject success(DomainServiceSpec.groovy:132)
我在使用保存对象进行测试时遇到问题,我尝试了多个选项但仍然遇到相同的错误。我怀疑这是因为域对象在不同的 jar 中,有人可以帮我解决这个问题吗?
谢谢
当您指定 saveDomain(domainObject)
时,您是在告诉 Spock 期望使用 domainObject
中的值作为参数调用该方法 。但是,在您的代码中,您正在创建一个新的 DomainObject
并将 that 传递给您的模拟。这就是我想你想要的:
1 * domainDAO.saveDomain(_ as DomainObject) >> { it[0] }