spring-boot - Spock 测试:调用太少
问题描述
我正在为一个 Service 类编写 Spock 测试,该类的方法调用 Spring Boot 应用程序中 Dao 类中的另一个方法。但是,我得到:
Too few invocations for:
1 * dao.getAddressFromSomewhere("me") (0 invocations)
Unmatched invocations (ordered by similarity):
None
以下是源代码和测试代码,有人可以告诉我我做错了什么吗?似乎 dao 模拟根本没有被调用并返回“USA”。我在网上做了一些研究,找不到我做错了什么。
@Service
public class ServiceClass
{
@Autowired
private DaoClass dao;
public String getAddress(String name) {
return dao.getAddressFromSomewhere(name);
}
}
@Component
public class DaoClass {
public String getAddressFromSomewhere(String name) {
// get address from DB
......
}
}
这是我的 Spock 测试代码:
@ContextConfiguration
@Import(ServiceClass.class)
public class Test extends Specification {
@Autowired
private DaoClass dao;
@Autowired
private ServiceClass service;
@TestConfiguration
static class MockConfig {
def detachedMockFactory = new DetachedMockFactory()
@Bean
DaoClass dao() {
return detachedMockFactory.Mock(DaoClass)
}
}
def "Test Success Senario"() {
given: "dao"
dao.getAddressFromSomewhere("me") >> "USA";
when: "call service "
def actualResponse = service.getAddress("me");
then: "dao should be invoked with given response"
1 * dao.getAddressFromSomewhere("me")
actualResponse == "USA"
}
}
解决方案
1 * dao.getAddressFromSomewhere("me")
通过在块中写入,您then:
只需覆盖块中的交互。并且通过不通过您声明返回值,只需告诉模拟返回即可。您可以使用Spock 文档检查交互顺序:dao.getAddressFromSomewhere("me") >> "USA"
given:
>>
null
...在 then: 块中声明的交互在任何其他交互之前匹配。这允许使用在 then: 块中声明的交互来覆盖在 setup 方法中声明的交互。
您可以通过以下几种方式重写您的示例:
given:
在块中声明您的交互
def "Test Success Senario"() {
given: "dao"
1 * dao.getAddressFromSomewhere("me") >> "USA"
when: "call service "
def actualResponse = service.getAddress("me")
then: "dao should be invoked with given response"
actualResponse == "USA"
}
when:
在块中声明您的交互:
def "Test Success Senario"() {
when: "call service "
def actualResponse = service.getAddress("me")
then: "dao should be invoked with given response"
1 * dao.getAddressFromSomewhere("me") >> "USA"
actualResponse == "USA"
}
推荐阅读
- node.js - 在猫鼬中连接两个模型模式
- java - 如何使用 ArrayList HashMap 将 listview onItemClick 数据发送到另一个活动
- android - Android binder - 将 binder 调用限制为一个进程
- json - 删除不在字典中的用户
- c++ - OpenCV 简单的二维矩阵乘法失败
- java - 评论树,回复回复显示
- linked-list - Ocaml双链表:从双链表中删除满足条件的节点
- r - 在闪亮的应用程序中更改 tabPanels 名称的字体
- jsf - 忽略 JSF 动作方法的返回值
- python - 具有可选绑定的python链表队列