SpringBoot测试,在配置中注入值

时间:2020-06-15 07:50:08

标签: mongodb spring-boot dependency-injection testcontainers

我要做什么:

这是我的代码:

@ExtendWith({SpringExtension.class})
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = {
        "embedded.mongodb.install.enabled=true",
        "spring.data.mongodb.uri=mongodb://${embedded.mongodb.host}:${embedded.mongodb.port}/${embedded.mongodb.database}"
})
@AutoConfigureMockMvc
@ImportAutoConfiguration
class UploadFileControllerTest {

    @LocalServerPort
    private int port;

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    private static MongoDBContainer mongoDbContainer;

    @BeforeAll
    public static void startContainer() {
        mongoDbContainer = new MongoDBContainer();

        mongoDbContainer.start();
        // !!! this one should be injected into spring.data.mongodb.uri
        System.out.println("mongoURL: " + mongoDbContainer.getReplicaSetUrl());
        // !!!
    }

    @AfterAll
    public static void stopContainer() {
        mongoDbContainer.stop();
    }

    @Test
    void testUploadAndParseFile() throws Exception {
        var fileUploadTask = uploadFileUsingMockMvc(zipFile);
        System.out.println(fileUploadTask);
    }
}

我找不到填充spring.data.mongodb.uri配置值的方法。

2 个答案:

答案 0 :(得分:2)

在使用JUnit 5时,可以对Testcontainer使用JUnit Jupiter扩展,因此不必手动启动和停止它们(如JUnit 4中的@ClassRule):

<dependency>
  <groupId>org.testcontainers</groupId>
  <artifactId>junit-jupiter</artifactId>
  <version>${testcontainers.version}</version>
  <scope>test</scope>
</dependency>

,如果您使用Spring Boot> = 2.2.6,他们甚至简化了使用@DynamicPropertySource在测试中动态设置属性的方式。

如果将两者结合使用,则测试结果如下所示:

// @ExtendWith({SpringExtension.class}) not needed, already part of @SpringBootTest
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
@ImportAutoConfiguration
@Testcontainers // this is new
class UploadFileControllerTest {

    @LocalServerPort
    private int port;

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    @Container
    private static MongoDBContainer mongoDbContainer = new MongoDBContainer();

    @DynamicPropertySource
    static void mongoDbProperties(DynamicPropertyRegistry registry) {
      registry.add("spring.data.mongodb.uri", mongoDbContainer::getUri);
    }


    @Test
    void testStuffWithMongo() throws Exception {
     // bla-bla-bla
    }
}

如果您使用的是JUnit 4或2.2.6之前的Spring Boot版本,则我收集了不同的设置方法here

答案 1 :(得分:0)

这是我的解决方案,因为它具有全局静态,所以闻起来有点香,但是至少可以起作用

包装容器

function myFunction() {
  var ss = SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Master');
  var rg=sh.getRange(1, 1, sh.getMaxRows(), sh.getMaxColumns());
  rg.clear({contentsOnly:true});
  var url="https://projects.fivethirtyeight.com/soccer-api/club/spi_matches_latest.csv";
  var data=UrlFetchApp.fetch(url).getContentText();
  var csvA=Utilities.parseCsv(data);
  var now=new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate());
  var daysAgo=new Date(now.getFullYear(),now.getMonth()+1,now.getDate()-1);
  var daysLater=new Date(now.getFullYear(),now.getMonth()+1,now.getDate()+15);
  var values=csvA.filter(function(e, i) {
    if(i>0) {
      var tA=e[0].split('-');
      var temp=new Date(tA[0],tA[1],tA[2]);
      return temp.getTime() >= daysAgo.getTime() && temp.getTime()<=daysLater.getTime();
    }else{
      return true;
    }
  });
}

这个东西允许在测试实例化期间覆盖属性

public class MongoDbContainerEntryPoint {

    private static MongoDBContainer mongoDbContainer = new MongoDBContainer();

    public static void start() {
        mongoDbContainer.start();
    }

    public static void stop() {
        mongoDbContainer.stop();
    }

    public static String getUri() {
        return mongoDbContainer.getReplicaSetUrl();
    }
}

这是测试

public class MongoDBContextInitializer implements
        ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext ac) {

        ConfigurableEnvironment ce = ac.getEnvironment();
        System.out.println("Setting to configuration: " + MongoDbContainerEntryPoint.getUri());
        TestPropertyValues values = TestPropertyValues.of(
                "spring.data.mongodb.uri=" + MongoDbContainerEntryPoint.getUri()
        );
        values.applyTo(ac);
    }
}
相关问题