spring-boot - 斯波克测试 : Too few invocation

我正在为一个服务类编写 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"
 }
}

最佳答案

通过在 then: 中编写 1 * dao.getAddressFromSomewhere("me") block ,您只需覆盖交互 dao.getAddressFromSomewhere("me") >> "USA" 在你的 given: block 中。通过不通过 >>> 声明返回值,您只需告诉 mock 返回 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.

您可以通过多种方式重写您的示例:

  1. given: block 中声明您的交互
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"
}
  1. then: block 中声明您的交互:
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"
}

https://stackoverflow.com/questions/54489759/

相关文章:

c# - 如何生成包含 JSON 结构的要下载的文件?

firebase - 限制经过身份验证的用户访问 Firestore

angular - NGRX Store adapter.updateone 不更改属性以进行更改检

python - 替换 Pandas 数据框中的点

macos - Homebrew/brew 在安装 gnuplot 时没有选择选项

python - Django 获取一个月中每一天的对象数

google-maps - 如何使 flutter google map 中的标记随相机而不是 ma

react-native - 如何从 react-native 代码中禁用 Android 默认 "

r - 如何在绘图中制作垂直线段?

ruby-on-rails - 使用 RubyZip 生成文件并下载为 zip