2017-08-16 91 views
1

我试图建立一个春天启动JUnit测试与嵌入式蒙戈&卡夫卡: -春天引导与嵌入式蒙戈:无法分配请求的地址:JVM_Bind

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, 
     classes = {AccountingApplication.class}) 
@DataMongoTest 
public class BaseEmbeddedTest { 


    @ClassRule 
    public static KafkaEmbedded embeddedKafka = new KafkaEmbedded(1, true); 

    @Autowired 
    private MongoTemplate mongoTemplate; 


    @Test 
    public void emptyTest(){ 

    } 

} 

的src /测试/资源/应用.yml: -

spring: 
    data: 
    mongodb: 
     port: 0 
    kafka: 
    bootstrap-servers: ${spring.embedded.kafka.brokers} 

问题

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [de.flapdoodle.embed.mongo.config.IMongodConfig]: Factory method 'embeddedMongoConfiguration' threw exception; nested exception is java.net.BindException: Cannot assign requested address: JVM_Bind 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) 
    ... 140 more 
Caused by: java.net.BindException: Cannot assign requested address: JVM_Bind 
    at java.net.DualStackPlainSocketImpl.bind0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106) 
    at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387) 
    at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190) 
    at java.net.ServerSocket.bind(ServerSocket.java:375) 
    at java.net.ServerSocket.<init>(ServerSocket.java:237) 
    at de.flapdoodle.embed.process.runtime.Network.getFreeServerPort(Network.java:80) 
    at org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration.embeddedMongoConfiguration(EmbeddedMongoAutoConfiguration.java:147) 

我在这里做错了什么?

版本: -

dependencyManagementPluginVersion = '1.0.3.RELEASE' 
    springBootVersion = '1.5.6.RELEASE' 
    springCloudVersion = 'Dalston.SR2' 
    projectVersion = '0.0.1-SNAPSHOT' 
    javaVersion = 1.8 
    kotlinVersion = '1.1.4' 

回答

1

此注释:@DataMongoTest导致春季启动创建一个嵌入蒙戈实例。异常消息告诉我们,嵌入式Mongo实例无法启动,因为已经有一个进程在运行的端口上运行。

嵌入式蒙戈实例被EmbeddedMongoAutoConfiguration配置和春季启动应用的策略 - 为端口分配 - 如下:

if configured Mongo port > 0 then 
    use the configured port 
else 
    assign a random port 
end 

所以,我怀疑你的测试范围内配置有非零值为spring.data.mongodb.port。我知道你发布了你的application.yml,这意味着你正确地指定了一个零值给spring.data.mongodb.port,但是如果你在EmbeddedMongoAutoConfiguration构造函数中放置了一个断点,并且在属性参数中查看了内容,我想你会看到实际使用的值通过该配置类不是零。如果传递给EmbeddedMongoAutoConfiguration的端口值实际上为零,但您仍然收到JVM_Bind错误,那意味着此调用:Network.getFreeServerPort(this.getHost())未返回空闲端口,这似乎不太可能。

为了解决这个问题:只要你用spring.data.mongodb.port=0配置你的测试上下文,那么嵌入式Mongo实例将被分配一个随机端口,并且这个随机端口将会让你的Spring上下文的其他方面知道(比如您的MongoTemplate)需要与该Mongo实例交谈。

相关问题