Spock 测试:调用太少
Spock Testing: Too few invocation
我正在为服务 class 编写 Spock 测试,其方法在 spring 引导应用程序中调用 Dao class 中的另一个方法。但是,我得到:
Too few invocations for:
1 * dao.getAddressFromSomewhere("me") (0 invocations)
Unmatched invocations (ordered by similarity):
None
下面是源代码和测试代码,有人可以告诉我我做错了什么吗?似乎 dao 模拟根本没有被调用 return "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"
}
}
通过在 then:
块中写入 1 * dao.getAddressFromSomewhere("me")
,您只需覆盖 given:
块中的交互 dao.getAddressFromSomewhere("me") >> "USA"
。通过不通过 >>
声明 returning 值,您只需告诉模拟 return null
。您可以使用 Spock doc:
检查交互顺序
...Interactions declared in a then: block are matched against before any other interactions. This allows to override interactions declared in, say, a setup method with interactions declared in a then: block.
您可以通过多种方式重写示例:
- 在
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"
}
我正在为服务 class 编写 Spock 测试,其方法在 spring 引导应用程序中调用 Dao class 中的另一个方法。但是,我得到:
Too few invocations for:
1 * dao.getAddressFromSomewhere("me") (0 invocations)
Unmatched invocations (ordered by similarity):
None
下面是源代码和测试代码,有人可以告诉我我做错了什么吗?似乎 dao 模拟根本没有被调用 return "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"
}
}
通过在 then:
块中写入 1 * dao.getAddressFromSomewhere("me")
,您只需覆盖 given:
块中的交互 dao.getAddressFromSomewhere("me") >> "USA"
。通过不通过 >>
声明 returning 值,您只需告诉模拟 return null
。您可以使用 Spock doc:
...Interactions declared in a then: block are matched against before any other interactions. This allows to override interactions declared in, say, a setup method with interactions declared in a then: block.
您可以通过多种方式重写示例:
- 在
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"
}