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->27017/tcp
开头。您能否更具体地说明您希望我更改的内容?
【参考方案1】:
我已添加:
mongoDb.setPortBindings(List.of("27017:27017"));
这解决了这个问题:
org.mongodb.driver.cluster : 集群描述还没有 可用的。在超时之前等待 30000 毫秒。
【讨论】:
你在哪里添加的?以上是关于Testcontainers mongodb - 集群描述尚不可用。在超时前等待 30000 毫秒的主要内容,如果未能解决你的问题,请参考以下文章
无法连接到 SpringTest 中由 TestContainers 创建的容器
排除特定测试的 embedded.mongodb.enabled
Spring testcontainers Driver org.testcontainers.jdbc.ContainerDatabaseDriver 声称不接受 jdbcUrl