问题描述
首先,它可能看起来与 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 环境中被禁用的任何配置文件,反之亦然。