Testcontainers mongodb-群集描述尚不可用。等待30000毫秒,然后超时

问题描述 投票:0回答:1

我有基本的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字段的对象。我简化了上面的代码以使其更像VCE。测试运行时,我看到容器正在运行并暴露端口。

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

我正在Windows上运行它。

我有基本的Spring信息库:@Repository公共接口LRepository扩展了MongoRepository

{}并且我在服务中使用它:@Service @RequiredArgsConstructor(...

spring mongodb docker docker-for-windows testcontainers
1个回答
0
投票
我添加了:

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

© www.soinside.com 2019 - 2024. All rights reserved.