我有基本的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.
我试图通过增加超时来解决它:
如果我从docker启动mongo容器,则测试成功。@Configuration public class MongoConfiguration { @Bean public MongoClientOptions mongoOptions() { return MongoClientOptions .builder() .serverSelectionTimeout(180000) .build(); } }
但是更多的时间对我没有帮助。
L
是带有String
字段的对象。我简化了上面的代码以使其更像VCE。测试运行时,我看到容器正在运行并暴露端口。
我正在Windows上运行它。
我有基本的Spring信息库:@Repository公共接口LRepository扩展了MongoRepository
{}并且我在服务中使用它:@Service @RequiredArgsConstructor(...
mongoDb.setPortBindings(List.of("27017:27017"));