Spring Boot 单元测试找不到注入的依赖项

2w3rbyxf  于 2023-11-17  发布在  Spring
关注(0)|答案(1)|浏览(197)

我的项目使用spring-boot 2.1.6。
我尝试测试以下代码:

  1. @Component
  2. public class MyComponent {
  3. @Autowired
  4. private MyClient client;
  5. @Value("${api.bah.url}")
  6. private String url;
  7. public SaidaPadrao listarCnpj(DtoCnpjRequest dtoRequest) {
  8. log.debug("Sending request to url=" + url);
  9. return client.listarCnpjConvivencia(dtoRequest);
  10. }
  11. }

字符串
(请注意,我稍微简化了代码。)
在我的测试中,我试着这样做:

  1. @RunWith(MockitoJUnitRunner.class )
  2. public class AleloConvivenciaComponentTest {
  3. @Autowired
  4. @Spy
  5. private MyComponent comp;
  6. @Test
  7. public void testHML() {
  8. var dtoRequest = // ...
  9. SaidaPadrao listarCnpjs = comp.listarCnpj(dtoRequest);
  10. // ...
  11. }


我的问题是:
当使用@Autowired(没有@Spy)加载MyComponent comp时,我在单元测试中得到了comp上的NullPointer。当使用@Autowired@Spy时,我设法在comp.listarCnpj上运行测试。
但是,在comp.listarCnpj方法中,测试失败,NullPointer位于client.listarCnpjConvivencia我错过了什么?我想完整地运行这个方法,在这种情况下没有模拟。 附加问题:${api.bah.url}在默认的application.yml文件中,但由于某种原因,它似乎无法加载。值始终为null。我简化了代码,但此配置用于client.listarCnpjConvivencia`中。此配置文件不应在测试中默认加载?

yi0zb3m4

yi0zb3m41#

单元测试运行在一个单独的上下文中,而不是您正常运行的Sping Boot 应用程序,它都由JUnit框架运行和管理。
你可以了解更多关于JUnit here的信息,它描述了框架是如何工作的。
通过你提供的代码看起来你想得到Spring Framework示例化的对象,但你只使用了MockitoJUnitRunner,它只提供mocking功能,你应该使用SpringRunner来处理这个任务,取决于你的需要,你是否需要整个spring上下文,你可以使用@SpringBootTest annotation来实现这个目的。
我建议你检查这个link,因为它描述了关于如何实现这一点的详细信息和示例。

相关问题