代码之家  ›  专栏  ›  技术社区  ›  MissConfusion

我应该在java测试类中使用@Autowired注释吗?

  •  0
  • MissConfusion  · 技术社区  · 3 年前

    我一直在java测试类中使用@Mock和@injectMock。我今天遇到了一个奇怪的情况。当我为WebTestClient做@mmock时,它会给我null指针异常,说它有可能为null。

    当我将注释更改为@Autowire时,它会按预期工作。

    请让我知道为什么@mock在上述情况下不起作用。如果在这里问这个问题真的很愚蠢,我深表歉意。

    我正试图测试一个控制器,该控制器返回Flux<整数>。

    也请为我回答这个问题:

    • 在测试类中使用@Autowired是一种好的做法,还是我们只在特殊情况下使用它?

    我期望使用mock不应该给我NPE。

    1 回复  |  直到 3 年前
        1
  •  1
  •   Emanuel Trandafir    3 年前

    如果您正在编写一个启动spring上下文的测试(例如,注释为 @SpringBootTest ),您将能够从上下文中@Autowire-beans。这将为您提供实际的(真实的)对象。

    另一方面,mock是看起来像真实对象的“假”对象,但它们什么也不做——如果你没有指定明确的行为,它们只会返回null。

    因此,当您嘲笑WebClient时,这样的代码可能会引发异常:

    webClient.get()
      .uri("/api/users/123")
      .exchange()
      ...etc
    

    这是因为WebClient正在使用这种流畅的API,这可能更难模仿。的回归 .get() 将为null,因此 .uri(...) 将引发异常。


    因此,他们提供了一些嘲笑的替代方案。正如你在问题中提到的,有这个 WebTestClient ,一个遵循相同接口但专门为单元测试创建的对象。由于您已经在使用这个WebTestClient,所以尝试模拟它是没有意义的:作为一个测试对象,它不会执行实际的HTTP调用。