Spring Boot嵌入式MongoDB在构建过程中无法工作。

huangapple 未分类评论58阅读模式
英文:

Spring boot Embedded MongoDB not working during build

问题

这里是您提供的内容的翻译:

我在测试中使用了嵌入式 MongoDB,并且所有的 MongoRepository 测试都正常工作。但是只有当我逐个运行服务测试,或者在 IDE 中运行测试类中的所有测试时,它们才能正常工作,但在构建过程中却不起作用。

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

    @Autowired
    private UserService userService;

    @Autowired
    private UserRepository userRepository;

    private User user = new User(.....);

    @Test
    public void findByEmail() {
        // 准备
        String email = user.getEmail();
        User savedUser = userService.save(user);

        // 执行
        Optional<User> optionalUser = userService.findByEmail(email);

        // 断言
        assertThat(optionalUser.isPresent()).isTrue();
        assertThat(optionalUser.get().getEmail()).isEqualTo(email);
        assertThat(optionalUser.get()).isEqualTo(savedUser);
    } 
.....

依赖项:

testCompile 'de.flapdoodle.embed:de.flapdoodle.embed.mongo:2.2.0'

这里是您的错误日志:

无法加载应用程序上下文
java.lang.IllegalStateException: 无法加载应用程序上下文
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)
	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108)
	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118)
	.....
Caused by: org.springframework.beans.factory.BeanCreationException: 在类路径资源 [org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.class] 中定义的 'embeddedMongoServer' Bean 创建时出错: 调用初始化方法失败; 嵌套异常是 java.io.IOException: 无法启动进程: <EOF>
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1771)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
	.......
Caused by: java.io.IOException: 无法启动进程: <EOF>
	at de.flapdoodle.embed.mongo.AbstractMongoProcess.onAfterProcessStart(AbstractMongoProcess.java:79)
	at de.flapdoodle.embed.process.runtime.AbstractProcess.<init>(AbstractProcess.java:116)
	at de.flapdoodle.embed.mongo.AbstractMongoProcess.<init>(AbstractMongoProcess.java:53)
	at de.flapdoodle.embed.mongo.MongodProcess.<init>(MongodProcess.java:50)
	at de.flapdoodle.embed.mongo.MongodExecutable.start(MongodExecutable.java:44)
	at de.flapdoodle.embed.mongo.MongodExecutable.start(MongodExecutable.java:34)
	at de.flapdoodle.embed.process.runtime.Executable.start(Executable.java:108)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1897)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1839)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1767)
	... 65 more
英文:

I'm using Embedded Mongodb in my tests and all MongoRepository tests working fine. But services tests working fine only if I run their one by one or all in the test class using IDE and don't work during the build.

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

    @Autowired
    private UserService userService;

    @Autowired
    private UserRepository userRepository;

    private User user = new User(.....);

    @Test
    public void findByEmail() {
        // Arrange
        String email = user.getEmail();
        User savedUser = userService.save(user);

        // Act
        Optional&lt;User&gt; optionalUser = userService.findByEmail(email);

        // Assert
        assertThat(optionalUser.isPresent()).isTrue();
        assertThat(optionalUser.get().getEmail()).isEqualTo(email);
        assertThat(optionalUser.get()).isEqualTo(savedUser);
    } 
.....

dependency:

	testCompile &#39;de.flapdoodle.embed:de.flapdoodle.embed.mongo:2.2.0&#39;

Here you can see my error logs:

Failed to load ApplicationContext
java.lang.IllegalStateException: Failed to load ApplicationContext
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)
	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108)
	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118)
	.....
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name &#39;embeddedMongoServer&#39; 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: &lt;EOF&gt;
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1771)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
	.......
Caused by: java.io.IOException: Could not start process: &lt;EOF&gt;
	at de.flapdoodle.embed.mongo.AbstractMongoProcess.onAfterProcessStart(AbstractMongoProcess.java:79)
	at de.flapdoodle.embed.process.runtime.AbstractProcess.&lt;init&gt;(AbstractProcess.java:116)
	at de.flapdoodle.embed.mongo.AbstractMongoProcess.&lt;init&gt;(AbstractMongoProcess.java:53)
	at de.flapdoodle.embed.mongo.MongodProcess.&lt;init&gt;(MongodProcess.java:50)
	at de.flapdoodle.embed.mongo.MongodExecutable.start(MongodExecutable.java:44)
	at de.flapdoodle.embed.mongo.MongodExecutable.start(MongodExecutable.java:34)
	at de.flapdoodle.embed.process.runtime.Executable.start(Executable.java:108)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1897)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1839)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1767)
	... 65 more

答案1

得分: 0

尝试使用以下代码段:

System.setProperty("os.arch", "x86_64");

如下方代码片段所示:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class EmbeddedMongoApplication {

	public static void main(String[] args) {
		 System.setProperty("os.arch", "x86_64");
         SpringApplication.run(EmbeddedMongoApplication.class, args);
	}
	
	@Bean
	public EmbeddedMongoAutoConfiguration embeddedMongoAutoConfiguration(MongoProperties mongoProperties) {
		return new EmbeddedMongoAutoConfiguration(mongoProperties);
	}
}
英文:

Try using

System.setProperty(&quot;os.arch&quot;, &quot;x86_64&quot;);

As show in below code snippet.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class EmbeddedMongoApplication {

	public static void main(String[] args) {
		 System.setProperty(&quot;os.arch&quot;, &quot;x86_64&quot;);
         SpringApplication.run(EmbeddedMongoApplication.class, args);
	}
	
	@Bean
	public EmbeddedMongoAutoConfiguration embeddedMongoAutoConfiguration(MongoProperties mongoProperties) {
		return new EmbeddedMongoAutoConfiguration(mongoProperties);
	}
}

huangapple
  • 本文由 发表于 2020年5月5日 05:45:14
  • 转载请务必保留本文链接:https://java.coder-hub.com/61602151.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定