Testcontainers mongodb - описание кластера пока недоступно. Ожидание 30000 мс до истечения времени ожидания - PullRequest
0 голосов
/ 23 января 2020

У меня есть базовый c 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. Я упростил приведенный выше код, чтобы сделать его более M VCE. Когда тест запускается, я вижу контейнер, работающий и открывающий порт.

Если я запускаю mon go контейнер с docker, тест пройден успешно.

Я запускаю его на Windows.

1 Ответ

0 голосов
/ 23 января 2020

Я добавил:

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

Это исправляет эту проблему:

org.mongodb.driver.cluster: описание кластера пока недоступно. Ожидание 30000 мс до истечения времени ожидания.

...