flapdoodle Embedded MongoDB 테스트가 실행되지 않는 이유는 무엇입니까? ('embedded MongoServer'를 생성하면 프로세스 EOF를 시작할 수 없습니다.)
저는 제 새 프로젝트를 만드는 데 어려움을 겪고 있습니다.저는 https://start.spring.io/ 을 사용하여 새로운 Spring 2.0 MongoDB Maven 프로젝트를 생성했으며, 통합 테스트를 위해 내장된 MongoDB 데이터베이스를 가지고 싶습니다.스프링 이니셜라이저는 여기에 de.flapdoodle.embed.mongo에 대한 종속성을 추가했습니다.
하지만 "mvn 클린 패키지"를 실행하려고 할 때마다 테스트 중에 다음 오류가 발생합니다.
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>
저도 같은 상황이었고, 다음과 같은 방법으로 @DirtiesContext를 사용하여 해결할 수 있었습니다.
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class CommoditiesApplicationTests {
}
application.properties에서 다음 행을 주석 처리하고 다른 프로파일에 배치하는 것도 가능합니다.여기서 찾았습니다
spring.data.mongodb.database=
spring.data.mongodb.host=
spring.data.mongodb.port=
나의 오류 메시지는 정확히 다음과 같았습니다.
2022-03-15 10:57:00.053 WARN 7196 --- [ Test worker] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'embeddedMongoServer' defined in class path resource [org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.class]: Unsatisfied dependency expressed through method 'embeddedMongoServer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'embeddedMongoConfiguration' defined in class path resource [org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [de.flapdoodle.embed.mongo.config.MongodConfig]: Factory method 'embeddedMongoConfiguration' threw exception; nested exception is java.lang.IllegalStateException: Set the spring.mongodb.embedded.version property or define your own MongodConfig bean to use embedded MongoDB
그래서 application.yml 파일에 속성을 추가합니다.
spring.mongodb.embedded.version: 3.2.3
그리고, 해결했습니다.
일반적으로 이미 실행 중인 mongodb 인스턴스가 문제의 원인입니다.기본 mongodb 포트를 점유하는 것이 있는지 확인하는 것부터 시작하겠습니다 - 27017.
저의 경우 64비트 mongodb 클라이언트 대신 32비트 mongodb 클라이언트가 다운로드되었습니다.inbedded.mongo 라이브러리는 BitSize 클래스를 사용하여 OS 아키텍처를 결정합니다.내 시스템에서System.getProperty("os.arch")에 나열된 값을 반환하지 않았습니다.if진술.나는 설정으로 문제를 해결했습니다.os.arch시스템 속성x86_64(가 사용하는 값 중 하나)BitSize돌아오다B64) 제 애플리케이션 메인에 있습니다.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
System.setProperty("os.arch", "x86_64");
SpringApplication.run(Application.class, args);
}
}
참고:System.getProperty("os.arch")32비트 Java 버전을 사용하여 64비트 시스템에서 응용 프로그램을 실행하면 잘못된 값을 반환합니다!
스프링 플러그인을 통해 다운로드된 mongodb의 인스턴스는 32이고 64비트 Java 또는 그 반대일 가능성이 있습니다.수정 사항을 확인한 다른 방법이 있는지 확인 부탁드립니다.
저는 여기서 거의 같은 시나리오를 가지고 있었고, 그것을 사용하여 해결했습니다.
<dependency>
<groupId>com.github.fakemongo</groupId>
<artifactId>fongo</artifactId>
<version>2.1.1</version>
<scope>test</scope>
</dependency>
대신에de.flapdoodle.embed.mongo
제 경우에는 소켓 파일이 아직 남아 있었습니다.
하기 위해 근본인문접기위해콘하로솔출원다중설니습정했을에 .else 절AbstractMongoProcess::onAfterProcessStart(실패 시 타격됨).서 여서액수있다니습할기에 수 .logWatch실행할 수 있습니다.System.out.println(logWatch.output.toString());디버깅 모드에서 mongo 콘솔을 꺼냅니다.나의 경우, 출력은 다음과 같이 말했습니다.SocketException: Address already in use
과 같은 .sudo lsof -iTCP -sTCP:LISTEN -n -P나를 위해 일하지 않았습니다(내 경우에는 아무것도 나열되지 않았습니다).
는 또 에서 실행한다는 했습니다.ls -lrta /tmp | grep .sock
.sock 파일은 이전 실행에서 여전히 존재했습니다(분명히 제가 테스트를 중단했습니다).
이 파일을 삭제하면 문제가 해결됩니다.
이 오류는 Embedded Mongo에 사용된 de.flapdoodle.embed 패키지로 인해 발생합니다. 3.5.0의 안정적인 버전을 사용하십시오.
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<version>3.5.0</version>
<scope>test</scope>
</dependency>
pom.file에 추가합니다(버전 추가).그럼 업데이트 메이븐은 정상적으로 작동할 것입니다.
제 경우는 좀 특별했지만, 어쩌면 이것이 다른 누군가에게 이 문제를 해결하는 데 도움이 될 수도 있습니다.
만약 당신이 win 10을 사용하고 있고 이미 MongoDB를 서비스로 실행하고 있다면(나의 경우 이전 버전 - v3.4 - 실행), 서비스를 중지하고 테스트를 실행해 보십시오.
추가시를 추가해 .@DirtiesContext테스트 클래스 레벨까지.
앱 데이터/temp에서 'mongo' dir를 삭제하고 내장된 mongo를 검역하는 McAfee를 발견했습니다.McAfee를 끄고 tempongo를 다시 삭제했더니 모두 잘 실행되었습니다.
같은 문제입니다.spring.data.mongodb.port는 application.properties에서 27017이었습니다.0으로 바꿨습니다.0을 사용하면 대신 임의 포트가 할당됩니다.
통합 테스트는 다음과 같습니다.
@RunWith(SpringRunner.class)
@DataMongoTest
public class IntegrationTestIT { ... }
de.flapdoodle.embed:de.flapdoodle.embed.mongo:3.4.6을 사용합니다.
저도 같은 문제가 있었습니다.문제가 플랩 두들과 관련된 경우 이 github 문제를 참조하여 해결하십시오. https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/issues/427
플랩 두들 버전 >=3.5.0만 늘리고 가능하면 스프링 부트 버전도 최신 버전으로 늘립니다.
언급URL : https://stackoverflow.com/questions/49990340/why-does-my-flapdoodle-embedded-mongodb-test-fail-to-run-creating-embeddedmon
'programing' 카테고리의 다른 글
| VBA 매크로가 32000행 후 충돌합니다. (0) | 2023.07.17 |
|---|---|
| 응답을 호출할 때 "HTTP 헤더가 전송된 후 리디렉션할 수 없습니다"가 표시되는 이유는 무엇입니까?리디렉션()? (0) | 2023.07.17 |
| 파이썬에서 부울의 반대(부정)를 얻으려면 어떻게 해야 합니까? (0) | 2023.07.17 |
| 자바에서 mongodb 쿼리에서 직접 원시 JSON을 반환하는 방법은 무엇입니까? (0) | 2023.07.17 |
| 오류 가져오기 - ORA-01858: 숫자가 필요한 숫자가 아닌 문자가 발견되었습니다. (0) | 2023.07.17 |