没有为测试

时间:2017-12-28 19:21:10

标签: java spring spring-boot spring-test spring-config

我使用spring boot 1.5.9编写一个小型休息服务器。我刚开始使用初始化代码并且遇到了这种奇怪的行为。

我有一个小测试 -

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestMongo {

    @Autowired
    private MongoOperations mongoOps; 

    @Test
    public void testMongoConnection() {
        assertFalse(mongoOps.collectionExists("test"));
    }
}

最初,application.properties被忽略了。添加@SpringBootTest注释后,读取了application.properties但是发生了以下错误。

  

引起:org.springframework.validation.BindException:   org.springframework.boot.bind.RelaxedDataBinder $ RelaxedBeanPropertyBindingResult:   1个错误字段'port'上的对象'mongo'中的字段错误:被拒绝的值   [$ {mongo.port:27017}];代码   [typeMismatch.mongo.port,typeMismatch.port,typeMismatch.int,typeMismatch];   参数   [org.springframework.context.support.DefaultMessageSourceResolvable:   代码[mongo.port,port];参数[];默认消息[port]];   默认消息[无法转换类型的属性值   'java.lang.String'到属性'port'的必需类型'int';嵌套   例外是   org.springframework.core.convert.ConverterNotFoundException:没有   转换器发现能够从类型[java.lang.String]转换为   输入[int]]   org.springframework.boot.bind.PropertiesConfigurationFactory.checkForBindingErrors(PropertiesConfigurationFactory.java:359)   〜[spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] at   org.springframework.boot.bind.PropertiesConfigurationFactory.doBindPropertiesToTarget(PropertiesConfigurationFactory.java:276)   〜[spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] at   org.springframework.boot.bind.PropertiesConfigurationFactory.bindPropertiesToTarget(PropertiesConfigurationFactory.java:240)   〜[spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] at   org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:330)   〜[spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE] ... 56个常见帧   省略

我已尝试将此声明端口视为java.lang.Integer以及int。

配置bean看起来像这样 -

@Configuration
@EnableConfigurationProperties(MongoProperties.class)
public class SpringConfiguration {

    private MongoProperties mongoPropertiesConfiguration;

    public MongoProperties getMongoConfiguration() {
        return mongoPropertiesConfiguration;
    }


    @Autowired
    public void setMongoConfiguration(MongoProperties mongoConfiguration) {
        this.mongoPropertiesConfiguration = mongoConfiguration;
    }



    public @Bean MongoClient mongoClient() {
        return new MongoClient(mongoPropertiesConfiguration.getHost(), mongoPropertiesConfiguration.getPort());
    }

    public @Bean MongoDbFactory mongoDbFactory() {
        return new SimpleMongoDbFactory(mongoClient(), mongoPropertiesConfiguration.getDb());
    }

    public @Bean MongoOperations mongoOperations() {
        return new MongoTemplate(mongoDbFactory());
    }
}

并且

@ConfigurationProperties(prefix="mongo")
public class MongoProperties {

    private String host;
    private Integer port;
    private String db;

    public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }
    public Integer getPort() {
        return port;
    }
    public void setPort(Integer port) {
        this.port = port;
    }
    public String getDb() {
        return db;
    }
    public void setDb(String db) {
        this.db = db;
    }

}

我确实使用@EnableAutoConfiguration注释而不是@SpringBootTest运行测试。但这只适用于其中一项测试。我认为你的测试在哪个包中很重要,我认为@EnableAutoConfiguration可能不是正确的方法。

我一直在调试弹簧源一段时间,没有任何线索。

如果您有任何建议,请与我们联系。

编辑1: 根据要求,添加application.properties

mongo.host=localhost
mongo.port=${mongo.port:27017}
mongo.db=${mongo.db:synctool}

1 个答案:

答案 0 :(得分:-1)

不确定您的语法

  

mongo.port = $ {mongo.port:27017}

spring尝试将 $ {mongo.port:27017} 转换为MongoProperties.port整数属性

  

无法转换类型' java.lang.String'的属性值要求的类型' int'对于物业'港口'

如果要为您的属性设置一些默认值 见Spring-boot: set default value to configurable properties