java - 我可以创建一个 spring bean 作为我的 cucumber 步骤定义的一部分吗?

标签 java spring spring-boot cucumber cucumber-java

对于某些上下文,我的 Spring Boot 应用程序使用 LocalDate.now() 调用提供当前日期的外部 API,并检索各种信息。我们正在使用 Cucumber 进行测试,上面的内容在编写步骤定义时出现了问题,例如

Given external api "/some/endpoint/2021-04-21" returns csv
  | currency |
  | GBP      |

步骤定义测试代码使用wiremock来模拟该调用,但由于我们在生产代码中使用LocalDate.now(),因此除了 2021-04 之外的任何一天,测试都将失败 - 21.

我解决这个问题的方法是为 Clock 定义两个 bean然后我们可以自动连接到需要它们的服务并使用 LocalDate.now(clock)。 “真实”bean 的定义如下:

@Configuration
public class ClockConfiguration {
    @Bean
    public Clock clock() {
        return Clock.systemDefaultZone();
    }
}

测试 bean 像这样:

@Profile("cucumber")
@TestConfiguration
public class ClockConfiguration {
    @Bean
    public Clock clock() {
        return Clock.fixed(Instant.parse("2021-02-26T10:00:00Z"), ZoneId.systemDefault());
    }
}

这解决了我的问题并允许我为测试设置定义的时间,但我的问题是日期/时间是在测试配置中定义的。我想将其定义为我的步骤定义的一部分。例如类似

Given now is "2021-02-26T10:00:00Z"

有一个类似于以下内容的步骤定义

@Given("now is {string})
public void setDateTime(String dateTime) {
    //Create Clock bean here...
}

我有办法做到这一点吗?或者甚至在 cucumber 步骤中覆盖现有的 bean?

最佳答案

尝试用变量或静态方法替换日期,其响应可以通过步骤定义进行更改。

@Profile("cucumber")
@TestConfiguration
public class ClockConfiguration {
    @Bean
    public Clock clock() {
        return Clock.fixed(Instant.parse(TestScope.getDateValue()), ZoneId.systemDefault());
    }
}
@Given("now is {string})
public void setDateTime(String dateTime) {
    TestScope.setDateValue(dateTime);
}

关于java - 我可以创建一个 spring bean 作为我的 cucumber 步骤定义的一部分吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67199564/

相关文章:

具有大约 20000 个值声明的 Java 数组

java - 如何获取java中的所有权限?

java - 通过服务器运行Java

java - org.springframework.beans.factory.UnsatisfiedDependencyException : Error creating bean with name 'documentationPluginsBootstrapper' defined

java - 如何在 java hibernate 中将参数设置为单引号之间的 native 查询?

java - 禁用 IntelliJ kotlin 星标导入?

java - 编辑Java实体文件相当于在Spring Roo中生成then吗?

spring - 在 Spring 将单例注入(inject)原型(prototype)

java - Spring和MyBatis中语句的参数group_id没有找到TypeHandler

java - 使用 restAssured 测试 Spring Boot Rest 应用程序