如何在没有基本 http 身份验证的情况下强制 MockitoJUnitRunner 失败?

Posted

技术标签:

【中文标题】如何在没有基本 http 身份验证的情况下强制 MockitoJUnitRunner 失败?【英文标题】:How to enforce MockitoJUnitRunner fail without basic http authentication? 【发布时间】:2020-02-12 12:44:47 【问题描述】:

我编写了一个Spring Boot 应用程序,并且能够使用MockMvc 访问和测试Controller。问题是在测试期间没有强制执行安全性,我可以在没有用户的情况下访问Controller

我做错了吗?这是预期的行为吗?

ControllerTest类:

@RunWith(MockitoJUnitRunner.class)
public class ControllerTest 

    private MockMvc mockMvc;

    @Mock
    private Service service;

    @InjectMocks
    private Controller controller;

    private final static String URL = "/test";

    @Before
    public void setUp() throws Exception 
        mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
    

    @Test
    public void test() throws Exception 
        mockMvc.perform(get(URL))
        .andExpect(status().isOk());
    


我的SecurityConfig *** QA。

【问题讨论】:

您正在使用 Mockito 运行,您正在创建您赢得的控制器实例,应该如何实施安全性?而是使用 @WebMvcTest,如 Spirng Boot 参考指南中所述。或者,如果您真的想坚持这一点,请按照 Spring Security 参考指南中的说明启用测试安全性。但是,我建议坚持使用@WebMvcTest @M.Deinum 我仍然很难理解如何使用MockitoJUnitRunner 启用安全性。你能指出我在 Spring Security 参考中的确切位置可以找到这些信息吗? The testing chapter 是一个相当大的赠品。 【参考方案1】:

您的示例使用简单的单元测试来测试您的控制器。在此设置中,控制器由 Mockito 创建(控制器字段使用 Mockito 的 @InjectMocks 进行注释)。

Mockito 不知道 Spring,因此不会在您的测试中设置 Spring Security。

您需要使用 SpringRunner 来运行您的测试。这个运行器是 Spring 感知的,并允许您在运行测试之前正确初始化控制器。

测试应该看起来像这样(junit5):

@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = Controller.class)
public class ControllerTest 
  @Autowired
  private MockMvc mockMvc;

  @MockBean
  private Service serviceMock;

   @Test
    public void test() throws Exception 
        mockMvc.perform(get(URL))
        .andExpect(status().isOk());
    


查看我们的 Spring 文档或一些教程以获取更多信息

https://spring.io/guides/gs/testing-web/

https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html

【讨论】:

这个答案很好,但问题是它不能解决我的问题。我巩固了对 Web 层的理解,但如何将安全部分包含到测试中?我使用spring-security 模块。 那么您的配置中可能还有另一个问题:默认情况下,使用@WebMvcTest 注解的测试也会自动配置 Spring Security 和 MockMvc(引用自 javadoc)通常然后,您可以使用注释 WithMockUser 来模拟您的测试的现有授权。 javadoc 您可能想尝试使用 @SpringBootTest 而不是 @WebMvcTest 并另外添加 @AutoConfigureMockMvc。这将加载您的整个应用程序配置并配置 mockMvc。

以上是关于如何在没有基本 http 身份验证的情况下强制 MockitoJUnitRunner 失败?的主要内容,如果未能解决你的问题,请参考以下文章