我正在使用 Spring-Boot 项目和 MongoRepository 而不是 MongoTemplate。
使用 MongoTemplate 时,可以使用 MongoConnectionPool 动态设置主机名,如下所示:
@Autowired
MongoConnectionPool mongoConn
....
mongoConn.setHostname("127.23.45.89");
mongoConn.setPort(27017);
如何使用 MongoRepository 达到相同的效果?
我知道我可以通过指定主机名和端口
spring.data.mongodb.host=hostname1
spring.data.mongodb.port=27017
在 application.properties 文件中。
但是我正在使用 GenericContainer 通过 Docker 容器启动一个 mongo 实例来运行我的单元测试。容器将 IP 地址和端口动态分配给 mongo 实例,因此我需要能够在运行时动态设置 MongoRepository 的主机名和端口。
这就是我设置单元测试的方式。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MongoConfiguration.class)
public class HierarchiesServiceImplTests {
private static final Logger log = LoggerFactory.getLogger(HierarchiesServiceImplTests.class);
@Autowired
private HierarchiesService hierarchiesService;
@Autowired
private HierarchyRepository hierarchyRepo;
@BeforeClass
public void setUp() {
MockitoAnnotations.initMocks(this);
startMongo();
}
/**
* Starts a Mongo docker container, and configures the repository factory to use this instance.
*/
private void startMongo() {
GenericContainer mongo = new GenericContainer("mongo:3")
.withExposedPorts(27017);
mongo.start();
String containerIpAddress = mongo.getContainerIpAddress();
int mappedPort = mongo.getMappedPort(27017);
//TODO: set the hostname and port here so that the MongoRepository use this mongo instance instead of the default localhost.
log.info("Container mongo:3 listening on {}:{}", containerIpAddress, mappedPort);
}
这就是我的 MongoConfiguration.class
@Configuration
@EnableMongoRepositories
@ComponentScan({"com.is.hierarchies.service"})
public class MongoConfiguration {
}