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

mpbci0fu  于 2023-05-05  发布在  Java
关注(0)|答案(1)|浏览(135)

我一直在Java测试类中使用@Mock和@injectMock。我今天遇到了一个奇怪的情况。当我为WebTestClient使用@mock时,它会给我一个null指针异常,说明它有可能为null。
当我将注解更改为@Autowire时,它可以按预期工作。
请告诉我为什么@mock在上面的例子中不起作用。我很抱歉,如果这个问题真的是愚蠢的问这里。
我正在测试一个返回Flux的控制器。
请回答我这个问题:

  • 在测试类中使用@Autowired是一个好的实践吗?还是我们只在特殊情况下使用它?

我希望使用模拟不应该给予我NPE。

nhhxz33t

nhhxz33t1#

如果您正在编写一个启动spring上下文的测试(例如,用@SpringBootTest注解的测试),您将能够从上下文@Autowire beans。这将为您提供实际的(真实的)对象。
另一方面,mock是看起来像真实的对象的“假”对象,但它们什么也不做--如果您没有指定明确的行为,它们只是返回null。
所以,当你模仿你的WebClient时,这样的代码可能会抛出一个异常:

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

这是因为WebClient正在使用这种流畅的API,这可能更难模仿。.get()的返回值将为null,因此.uri(...)将抛出异常。
所以,他们提供了一些嘲笑的替代方案。正如你在问题中提到的,有一个WebTestClient,一个遵循相同接口的对象,但它是专门为单元测试而创建的。既然你已经在使用这个WebTestClient了,那么尝试模仿它是没有意义的:作为测试对象,它将不执行实际的HTTP调用。

相关问题