为什么我的flapdoodle嵌入式MongoDB测试无法运行? (创建' embeddedMongoServer'无法启动进程EOF)

时间:2018-04-23 21:36:29

标签: mongodb maven spring-boot spring-test embedded-database

我在制作全新的项目时遇到了麻烦。我用https://start.spring.io/生成了一个全新的Spring 2.0 MongoDB Maven项目,我希望有一个嵌入式MongoDB数据库用于我的集成测试。 spring初始化器为de.flapdoodle.embed.mongo添加了一个依赖项。

但每次我尝试运行" mvn clean package"时,我在测试期间收到以下错误:

Caused by: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'embeddedMongoServer' defined in class path resource
[org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.class]: 
Invocation of init method failed; nested exception is java.io.IOException: 
Could not start process: <EOF>
at de.flapdoodle.embed.mongo.AbstractMongoProcess.onAfterProcessStart(AbstractMongoProcess.java:79) ~[de.flapdoodle.embed.mongo-2.0.3.jar:na]
at de.flapdoodle.embed.process.runtime.AbstractProcess.<init>(AbstractProcess.java:116) ~[de.flapdoodle.embed.process-2.0.2.jar:na]
at de.flapdoodle.embed.mongo.AbstractMongoProcess.<init>(AbstractMongoProcess.java:53) ~[de.flapdoodle.embed.mongo-2.0.3.jar:na]
at de.flapdoodle.embed.mongo.MongodProcess.<init>(MongodProcess.java:50) ~[de.flapdoodle.embed.mongo-2.0.3.jar:na]
at de.flapdoodle.embed.mongo.MongodExecutable.start(MongodExecutable.java:44) ~[de.flapdoodle.embed.mongo-2.0.3.jar:na]
at de.flapdoodle.embed.mongo.MongodExecutable.start(MongodExecutable.java:34) ~[de.flapdoodle.embed.mongo-2.0.3.jar:na]
at de.flapdoodle.embed.process.runtime.Executable.start(Executable.java:108) ~[de.flapdoodle.embed.process-2.0.2.jar:na]

我错过了什么?

我的应用程序文件非常简单:

@SpringBootApplication
public class NewnewinternetApplication {

    public static void main(String[] args) {
        SpringApplication.run(NewnewinternetApplication.class, args);
    }
}

我的配置文件非常简单:

@Configuration
@EnableMongoRepositories
@ComponentScan(basePackages = "com.snoop.dougg.newnewinternet")
public class AppConfig {

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/");
        resolver.setSuffix(".html");
        return resolver;
    }
}

我现在有两个简单的控制器只返回静态输出。

我有一个小文件:

@Document(collection = "user")
public class User implements Serializable {
    protected static final long serialVersionUID = -1L;

    @Id
    private String id;

    private String username;
    private String firstName;
    private String lastName;

    public User() {}

    public User(String username, String firstName, String lastName) {
        this.username = username;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    //Getters, setters, and equals and hash code methods...
}

然后是一个愚蠢的小测试:

@RunWith(SpringRunner.class)
//@SpringBootTest -> Doesn't work either
@DataMongoTest
public class NewnewinternetApplicationTests {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void sillyLittleTest() {
        mongoTemplate.save(new User("sdoug", "Snoop", "Dougg"));
        Assert.notNull(
            mongoTemplate.find(
                new Query(Criteria.where("firstName").is("Snoop")), User.class),
            "Couldn't find by first name!");
    }
}

然后我的pom文件,我真的只是一个人留下来了:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.snoop.dougg.newnewinternet</groupId>
    <artifactId>NewNewInternet</artifactId>
    <version>0.0.1</version>
    <packaging>jar</packaging>

    <name>NewNewInternet</name>
    <description>A new new internet</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.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>
        <azure.version>2.0.1</azure.version>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.M9</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-active-directory-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-keyvault-secrets-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-spring-boot</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-oauth2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-core</artifactId>
        </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>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.microsoft.azure</groupId>
                <artifactId>azure-spring-boot-bom</artifactId>
                <version>${azure.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>


</project>

9 个答案:

答案 0 :(得分:2)

在application.properties中注释以下各行并将它们放在其他配置文件中也可以工作。我找到了here

spring.data.mongodb.database=
spring.data.mongodb.host=
spring.data.mongodb.port=

答案 1 :(得分:1)

通常情况下,已经运行的mongodb实例是问题的根源。我将从检查是否有任何东西占用默认的mongodb端口-27017。

答案 2 :(得分:0)

机会是通过spring插件32下载的mongodb实例,而您正在64位Java上运行,反之亦然。请确认是否还有其他方法可以识别此修复程序。

答案 3 :(得分:0)

我的情况有点特殊,但这也许也可以帮助其他人解决这个问题。

如果有任何可能,您正在使用Win 10,并且已经有一个MongoDB作为服务运行(在我的情况下,它是一个较早的版本-v3.4-正在运行),则尝试停止该服务并运行然后进行测试。

答案 4 :(得分:0)

尝试将@DirtiesContext添加到测试课程级别。

答案 5 :(得分:0)

我处在相同的情况下,可以使用@DirtiesContext这样解决:

@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class CommoditiesApplicationTests {

}

答案 6 :(得分:0)

我在这里有相同的场景,并使用

解决了
    <dependency>
        <groupId>com.github.fakemongo</groupId>
        <artifactId>fongo</artifactId>
        <version>2.1.1</version>
        <scope>test</scope>
    </dependency>

代替de.flapdoodle.embed.mongo

答案 7 :(得分:0)

就我而言,套接字文件仍然存在。

要解决潜在的问题,我想要控制台日志输出,我在front: environment: - NEXT_PUBLIC_API=http://localhost:8080 的{​​{1}}子句中放置了一个断点(失败时会命中)。 在这里,您可以访问else,并且可以在调试模式下运行AbstractMongoProcess::onAfterProcessStart来退出mongo控制台。对于我的问题,输出显示为logWatch

建议尝试的命令System.out.println(logWatch.output.toString());对我不起作用(我的情况中未列出任何内容)

我找到了另一个SO答案,据说可以运行SocketException: Address already in use

.sock文件在以前的运行中仍然存在(显然我已经中断了测试)

删除此文件即可解决问题。

答案 8 :(得分:0)

就我而言,下载的是 32 位 mongodb 客户端,而不是 64 位客户端。 Embedded.mongo 库使用 BitSize 类来确定操作系统架构。在我的系统中,System.getProperty("os.arch") 没有返回 if 语句中列出的值。 我通过在我的应用程序主程序中将 os.arch 系统属性设置为 x86_64BitSize 用于返回 B64 的值之一)解决了这个问题。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        System.setProperty("os.arch", "x86_64");
        SpringApplication.run(Application.class, args);
    }
}

注意:如果您使用 32 位 java 版本在 64 位系统上运行您的应用程序,System.getProperty("os.arch") 将返回错误的值!