TestContainer踩坑

447 阅读1分钟

测试代码如下

@SpringBootTest
@Testcontainers
@AutoConfigureMockMvc
class ProductServiceApplicationTests {
    static MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.4.2");

    @Autowired
    private MockMvc mockMvc;
    @Autowired
    private ObjectMapper objectMapper;

    @DynamicPropertySource
    static void setProperties(DynamicPropertyRegistry dynamicPropertyRegistry) {
        dynamicPropertyRegistry.add("spring.data.mongodb.uri", mongoDBContainer::getReplicaSetUrl);
    }

    @Test
    void shouldCreateProduct() throws Exception {
        ProductRequest productRequest = getProductRequest();
        String productRequestString = objectMapper.writeValueAsString(productRequest);
        mockMvc.perform(MockMvcRequestBuilders.post("/api/product")
                .contentType(MediaType.APPLICATION_JSON)
                .content(productRequestString))
                .andExpect(status().isCreated());
    }

    private ProductRequest getProductRequest() {
        return ProductRequest.builder()
                .name("Iphone 13")
                .description("Iphone 13 is ready")
                .price(BigDecimal.valueOf(1200))
                .build();
    }


}

1.出现报错: MongoDBContainer should be started first

Failed to bind properties under 'spring.data.mongodb.uri' to java.lang.String:

    Reason: java.lang.IllegalStateException: MongoDBContainer should be started first

image.png

解决方式 添加注解@Container

@Container
static MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.4.2");

2.出现报错:Could not find a valid Docker environment.

image.png

猜测docker容器没启动,启动docker,重新运行测试用例.

image.png

3.启动了docker,还是失败. 尝试在 ~/.testcontainers.properties脚本中添加下面代码

#Modified by Testcontainers
#Wed Mar 04 17:59:09 MSK 2020
client.ping.timeout=60
docker.client.strategy=org.testcontainers.dockerclient.UnixSocketClientProviderStrategy

4.重新启动,运行成功.

image.png