Testcontainers mongodb - 集群描述尚不可用。在超时前等待 30000 毫秒

Posted

技术标签:

【中文标题】Testcontainers mongodb - 集群描述尚不可用。在超时前等待 30000 毫秒【英文标题】:Testcontainers mongodb - Cluster description not yet available. Waiting for 30000 ms before timing out 【发布时间】:2020-05-09 18:11:24 【问题描述】:

我有基本的Spring 存储库:

@Repository
public interface LRepository extends MongoRepository<L, String> 

我在服务中使用它:

@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class SerImpl 
    private final LRepository repository;

    public String saveL(L l) 
        l = repository.save(l);
        return l.id;
    

在线与.save(l) 我的测试超时。

@SpringBootTest
@ExtendWith(SpringExtension.class)
@Testcontainers
@ContextConfiguration(initializers = MongoIntegrationTest.TestPropertiesInitializer.class)
class MongoIntegrationTest 
    private SerImpl serImpl;

    @Autowired
    private LRepository lRepository;

    public static class TestPropertiesInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> 
        @Override
        public void initialize(ConfigurableApplicationContext configurableApplicationContext) 
            final TestPropertyValues values = TestPropertyValues.of(
                    "spring.data.mongodb.host=localhost",
                    "spring.data.mongodb.username=root",
                    "spring.data.mongodb.password=example",
                    "spring.data.mongodb.authentication-database=admin",
                    "spring.data.mongodb.database=l",
                    "spring.data.mongodb.uri=mongodb://root:example@localhost:27017"
            );
            values.applyTo(configurableApplicationContext);
        
    

    @Container
    public GenericContainer mongoDb = new GenericContainer("mongo:4.2.2")
            .withExposedPorts(27017)
            .withEnv("MONGO_INITDB_ROOT_USERNAME", "root")
            .withEnv("MONGO_INITDB_ROOT_PASSWORD", "example");

    @BeforeEach
    public void setUp() 
        mongoDb.start();

        String address = mongoDb.getContainerIpAddress();
        //List<Integer> exposedPorts = mongoDb.getExposedPorts();
        Integer port = mongoDb.getFirstMappedPort();
        Map<String,String> map = mongoDb.getEnvMap();
        serImpl = new SerImpl(lRepository);
    

    @Test
    public void testSimplePutAndGet() 
        String id = serImpl.saveL(new L("aaa"));
        assertNotNull(id);
    

在线l = repository.save(l);

我收到一个错误提示

org.mongodb.driver.cluster     : Cluster description not yet available. Waiting for 30000 ms before timing out.

我试图通过增加超时来修复它:

@Configuration
public class MongoConfiguration 
    @Bean
    public MongoClientOptions mongoOptions() 
        return MongoClientOptions
                .builder()
                .serverSelectionTimeout(180000)
                .build();
    

但更多的时间并没有帮助我。 L 是带有 String 字段的对象。 我简化了上面的代码,使其更像 MVCE。 当测试运行时,我看到容器正在运行并暴露端口。

如果我从 docker 启动 mongo 容器,则测试成功。

我在 Windows 上运行它。

【问题讨论】:

看来你的 MongoDb 在 docker 内部绑定了这样的 bind_ip 127.0.0.1,所以在 docker 内部你可以访问 mongo。试试你的变化:0.0.0.0 @Valijon 对不起,我没有忘记你。容器当前以0.0.0.0:32791-&gt;27017/tcp 开头。您能否更具体地说明您希望我更改的内容? 【参考方案1】:

我已添加:

    mongoDb.setPortBindings(List.of("27017:27017"));

这解决了这个问题:

org.mongodb.driver.cluster : 集群描述还没有 可用的。在超时之前等待 30000 毫秒。

【讨论】:

你在哪里添加的?

以上是关于Testcontainers mongodb - 集群描述尚不可用。在超时前等待 30000 毫秒的主要内容,如果未能解决你的问题,请参考以下文章

无法连接到 SpringTest 中由 TestContainers 创建的容器

Spring Boot Test,在配置中注入值

使用凭据启动 MongoDb 测试容器

排除特定测试的 embedded.mongodb.enabled

为 mongodb 的 micronaut 设置测试容器

Spring testcontainers Driver org.testcontainers.jdbc.ContainerDatabaseDriver 声称不接受 jdbcUrl