spring boot - 测试mongodb存储库

时间:2018-03-06 12:58:29

标签: spring mongodb spring-boot

spring boot app中我试图对我的mongo db存储库进行单元测试

public interface TimezoneDao extends MongoRepository<TimeZone, Long>
{
}

让spring boot配置嵌入式mongo db。这就是测试的样子

@RunWith(SpringRunner.class)
@DataMongoTest(includeFilters = @Filter(Service.class)) 
@ActiveProfiles("test")
public class Test_TimezoneDao {

    @Autowired private TimezoneDao dao;
    @Autowired private CounterService counterService;

    @Test
    public void test() {

    }
}

测试属性application-test.properties包含

#mongodb: use random port for testing
spring.data.mongodb.host=localhost
spring.data.mongodb.port=0
spring.data.mongodb.database=embeddedDB

spring.profiles.active=test

但是我得到以下stacktrace

2018-03-06 12:46:23.560  INFO 16172 --- [           main] org.mongodb.driver.cluster               : Cluster created with settings {hosts=[localhost:0], mode=MULTIPLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
2018-03-06 12:46:23.560  INFO 16172 --- [           main] org.mongodb.driver.cluster               : Adding discovered server localhost:0 to client view of cluster
2018-03-06 12:46:23.563  INFO 16172 --- [l'}-localhost:0] org.mongodb.driver.cluster               : Exception in monitor thread while connecting to server localhost:0

com.mongodb.MongoSocketOpenException: Exception opening socket
    at com.mongodb.connection.SocketStream.open(SocketStream.java:62) ~[mongodb-driver-core-3.6.3.jar:na]
    at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:126) ~[mongodb-driver-core-3.6.3.jar:na]
    at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:114) ~[mongodb-driver-core-3.6.3.jar:na]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_102]
Caused by: java.net.ConnectException: connect: Address is invalid on local machine, or port is not valid on remote machine
    at java.net.DualStackPlainSocketImpl.connect0(Native Method) ~[na:1.8.0_102]
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:83) ~[na:1.8.0_102]
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_102]
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_102]
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_102]
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_102]
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_102]
    at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_102]
    at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:59) ~[mongodb-driver-core-3.6.3.jar:na]
    at com.mongodb.connection.SocketStream.open(SocketStream.java:57) ~[mongodb-driver-core-3.6.3.jar:na]
    ... 3 common frames omitted

以下是我正在使用的依赖项

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.M8</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>de.flapdoodle.embed</groupId>
            <artifactId>de.flapdoodle.embed.mongo</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

注意

当我使用prod个人资料进行测试时,即使用application.properties

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=local

spring.profiles.active=prod

虽然我在local上运行了一个真正的mongo db localhost:27017但它运行正常。

因此,由于某种原因,它并没有真正尝试创建一个嵌入式mongo数据库。

修改

我注意到的另一件事是当我在application-test.properties中注释掉除spring.profiles.active=test之外的所有属性时,它连接到27017上的prod mongo db(!)

感谢您的帮助

0 个答案:

没有答案