【问题标题】:Test classes dependent on environment variables依赖于环境变量的测试类
【发布时间】:2019-10-01 11:36:17
【问题描述】:

我有一个依赖于环境变量的类。我想用一个模拟环境变量来测试它。

我认为一个好的结构是在 Spring Boot 中注入依赖,然后在测试环境中模拟它。我如何做到这一点?

例如下面的代码:

@Component
public class ProcessorClass implements Processor {

    public String readFile(String fileName) throws IOException {
            String fileOut;
            String path = Environment.getVariable("READ_PATH");
            fileOut = new String(Files.readAllBytes(Paths.get(path + fileName)));
return fileOut

我将如何注入 READ_PATH 以便我可以在 JUnit5 中模拟它。

Environment 是一个假类,当前返回来自System.getenv("...") 的值

谢谢。

【问题讨论】:

  • 考虑实现一个仅与test 配置文件一起使用的假类。您将避免尝试模拟环境变量,并且更容易让类以您想要的方式运行。
  • 请你提供一个例子吗?

标签: java spring-boot testing


【解决方案1】:

改用假货。当替代方案难以模拟时,它可能是一个更好的选择。在您的情况下,您当然可以只定义测试环境变量,但是当配置被划分到不同的地方时,它可能会变得混乱。更不用说您可能不想(或无法)在测试环境中读取任何文件。

@Component
@Profile("test")
public class ProcessorFake implements Processor {

    // Implement without actually reading from a file
}

@Component
@Profile("qa", "prod", "dev")
public class ProcessorClass implements Processor {
    // Real class used with other profiles
}

【讨论】:

    【解决方案2】:

    你还没有告诉我们这个Environment 是什么。如果有Environment.setVariable() 方法,请使用它。如果没有,请继续阅读。

    Environment.getVariable() 是一个静态的、全局可用的函数。它是在没有任何考虑测试问题的情况下创建的,它不适合测试。因此,它不应成为任何要测试的代码的一部分。

    创建一个单独的组件,比如EnvironmentWrapper,它的工作只是调用Environment.getVariable() 并返回结果;不测试该组件,因为它无法测试。然后,在您的 ProcessorClass 类中,调用 EnvironmentWrapper 以获取变量的值。在您的测试中,只需模拟该类即可。

    【讨论】:

    • 道歉Environment.getVariable("READ_PATH") 读取环境变量。 System.getenv(....)。这是我想模拟的假课程
    【解决方案3】:

    这可以通过 SystemStubs 实现 - https://github.com/webcompere/system-stubs

    有几种方法可以做到这一点。如果您知道在编码时应将环境变量设置为什么,那么:

    @ExtendWith(SystemStubsExtension.class)
    class SomeTest {
       @SystemStub
       private EnvironmentVariables env = new EnvironmentVariables("READ_PATH", "somepath");
    
       @Test
       void someTest() {
    
          // inside here, the variable is set, outside
          // it is't
       }
    }
    

    但是,如果你想让 Spring 也观察环境变量,那么你需要使用一个嵌套的测试类来进行 Spring 测试。 https://github.com/webcompere/system-stubs/blob/main/system-stubs-jupiter/src/test/java/uk/org/webcompere/systemstubs/jupiter/examples/SpringAppWithDynamicPropertiesTest.java有例子

    【讨论】:

      猜你喜欢
      • 2016-06-21
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      相关资源
      最近更新 更多