Java 集成测试,可根据运行位置指向WireMock和真实实例

Java 集成测试,可根据运行位置指向WireMock和真实实例,java,unit-testing,integration-testing,wiremock,spring-cloud-contract,Java,Unit Testing,Integration Testing,Wiremock,Spring Cloud Contract,我正在参与一个使用“SpringBoot2”的集成项目,我希望能够在本地和开发环境中针对wiremock运行集成测试。但是,当在测试环境中运行相同的测试时,我希望它们针对真正的服务而不是模拟运行。背后的想法是,wiremock有时会产生错误的安全感,通过这种方式执行它们来对抗我们现在实际工作的真实事物 我的主要问题是如何以尽可能不依赖wiremock的方式编写测试。该项目是SpringBoot2项目 例1 @TestConfiguration public class TestConfigura

我正在参与一个使用“SpringBoot2”的集成项目,我希望能够在本地和开发环境中针对wiremock运行集成测试。但是,当在测试环境中运行相同的测试时,我希望它们针对真正的服务而不是模拟运行。背后的想法是,wiremock有时会产生错误的安全感,通过这种方式执行它们来对抗我们现在实际工作的真实事物

我的主要问题是如何以尽可能不依赖wiremock的方式编写测试。该项目是SpringBoot2项目

例1

@TestConfiguration
public class TestConfiguration {

  public WireMockServie () {
      // initialize wiremock
  }

}

class MyIntegrationTest {

  @Autowire
  WiremockServer wiremock;

  @Test
  public void myTest() {
      //stubb something
      // test something
  }

}
现在这个办法不太好。因为它将存根进程和wiremock公开给测试,所以不能对实际服务执行相同的测试

例2

class MyIntegrationTest {

      @Autowire
      private static WiremockServer wiremock;

      @BeforeAll
      public static setup() {
         if(springProfile.equals("local") {
             // initialize wiremock
             // do stubbing global at a single place global for all tests inside the test class
         }
      }

      public void teardown(){
         if(springProfile.equals("local") {
             // destroy wiremock
         }
      }

      @Test
      public void myTest() {
         // now the test is agnostic of wiremock
      }

    }
与示例1相比,示例2是不可知的,可以针对实际实例运行。所有wiremock初始化都在setup方法内部静态进行

虽然示例2有效,但我觉得可能有更好的方法来实现这种行为

我的问题是:

  • 我在网上读到的大多数文章都讨论了WireMock实例的直接操作和存根的直接操作。这使得测试不具有不可知性,我不认为有一个好的方法可以让它们与真实的东西进行对比。是否有更好的方法来编写一个测试,根据测试执行的环境,该测试可以针对模拟和实际服务运行
  • 我读了一些关于SpringCloudContract的文章,这能帮助我实现期望的行为吗
  • 我的建议完全错了吗?我问的原因是,所有的手册都是直接操纵wiremock的,但他们从来没有提到实际将wiremock与真实的东西交换