2 回答
TA贡献1799条经验 获得超6个赞
在您的setUp()
方法中,您正在使用 Mockito 来模拟带有注释的 bean,@Mock
并将它们注入到 的新实例中ReceiptController
,然后将其放入带有注释的字段中@InjectMocks
。
ReceiptController
在下一行中,您将使用(您使用的)的新实例设置 MockMvc new ReceiptController()
,而不是使用 Mockito 创建的实例。这意味着该实例中的所有字段都将是null
.
这几乎可以归结为Why is my Spring @Autowired
fieldnull
。
要解决这个问题,您可以传递receiptController
给 MockMvc。在这种情况下,您还可以删除@WebMvcTest
和@RestClientTest
因为您不使用它们。
或者,您可以使用 设置测试,并通过使用in stead of和in stead of@RunWith(SpringRunner.class)
正确设置 Spring 测试。在这种情况下,您根本不需要方法,因为 MockMvc 可以由 Spring 自动装配。@Autowired
@InjectMocks
@MockBean
@Mock
setUp()
TA贡献1852条经验 获得超1个赞
允许您进行集成测试,而不是单元测试。
它们允许您启动实际的 Spring 应用程序(使用随机端口)并测试实际的控制器类及其依赖项。这意味着您在测试顶部声明的变量实际上并未在当前设置中使用。
如果你想对你的控制器进行单元测试,你可以删除@WebMvcTest,创建模拟依赖项(就像你所做的那样)并直接调用你的方法而不是使用 MockMvc。
如果你真的想写一个集成测试,你需要模拟你的外部依赖(例如数据库)。你可以配置spring在测试环境中使用嵌入式数据库(例如H2),这样就不会影响你的真实数据库。
添加回答
举报