SpringBootTest 由于 UnsatisfiedDependencyException 在使用 Docker 构建 Jenkins 期间失败

问题描述

首先,它可能看起来与 stackoverflow 上的其他帖子重复,我尝试了几种解决方案。但是,没有人能解决我的问题。

问题:

由于在 jenkins 构建期间出现 UnsatisfiedDependencyException,Springboot 测试失败。但是,有趣的是,在本地系统上,我没有看到相同的异常,而且我能够构建相同的代码库而没有任何错误/异常。

org.springframework.beans.factory.UnsatisfiedDependencyException: 在文件 [/use/jenkins/path 中定义名称为“myAppServiceImpl”的 bean 创建时出错 to class/MyAppServiceImpl.class] :不满足的依赖表示通过 构造函数参数1;

我只在 jenkins 构建期间遇到这个问题,而在我的本地系统上。我能够毫无问题地构建相同的代码库。所以,我不确定我应该做些什么改变才能让它在平台上运行。

由于限制,我无法分享确切的代码,但我分享了类似的代码

package com.tg.app.main.engine

@SpringBootApplication
@EnableConfigurationProperties(MyApplicationProperties.class)
@ComponentScan("com.tg.app")
class MyApplication{
// main method
}

测试

@RunWith(springrunner.class)
@SpringBoottest(webEnvironment=WebEnvironment.RANDOM_PORT,classes=MyApplication.class)
@AutoConfigurationmockmvc
@AutoConfigureWebTestClient(timeout="100000")
class MyApplicationTest{

 @Autowire
 private MyAppService myAppService;

//codes

}

服务

   package com.tg.app.main.engine.service
   public interface MyAppService{
   //method declaration
   }

   @Service
   public MyAppServiceImpl implements MyAppService{
   private UserService userService
   private String xyz;

      @Autowire
      public MyAppServiceImpl(String xyz,UserService userService){
       this.xyz=xyz;
       this.userService=userService;
      }
   }

我还尝试按照某些帖子中的建议添加 MyAppService,如下所示。

@SpringBoottest(webEnvironment=WebEnvironment.RANDOM_PORT,classes={MyApplication.class,MyAppService.class})

然后,stackoverflow (Must use mockbean instead of autowired) 上的一篇帖子建议不要使用 @MockBean(虽然我尝试过,但对我的情况没有帮助)。所以,我不确定我应该怎么做才能解决这个问题。需要帮忙。因为,这仅发生在平台上,所以不可能多次击中和跟踪那里。

如果需要任何其他信息,请告诉我。

==编辑==

同样的代码之前工作正常。这次我们将 SpringBoot 版本从 2.0 升级2.1删除了几个不必要的库。如上所述,代码只是为了让您了解代码的结构。它们不是实际的代码。这里要注意的另一件事是,我能够在本地机器上成功构建相同的代码,甚至可以毫无问题地启动服务。所以,我很确定,代码没有问题。这与构建此代码的平台有关。

我注意到我的本地机器和平台之间存在一些差异。首先,使用 Docker 触发构建,当我在本地(只是执行 maven 命令)时,情况并非如此。另一个是,集成测试在平台上使用 OpenJDK (maven 3.3.9-jdk-8) 运行,而在我本地我使用的是 Java Hotspot (Oracle jdk-8)。除此之外,我没有看到本地系统和平台之间的任何区别。

谢谢。

解决方法

问题在于 xyz 中的字符串 MyAppServiceImpl,Spring 实际上并未找到自动装配候选者,您可以添加到您的测试类中:

@MockBean
private String xyz = "whatever you are trying to inject";

这样你就可以超越失败的依赖注入

,

查看当前未导致问题的代码是浪费时间。

如果您因保密而无法共享实际代码,那么您应该创建一个测试项目,该项目会给您同样的错误并在此处共享。

话虽如此,我建议您检查 maven 中在您的机器中处于活动状态但在 jenkins 环境中被禁用的任何配置文件,反之亦然。