如何在没有基本 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 失败?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有身份验证的情况下添加 Firebase 数据库规则?

强制大摇大摆地要求使用 springfox 进行基本的 http 身份验证

如何在不强制断开连接的情况下使用 Go TLS 手动验证客户端证书?

在没有 IIS 管理器的情况下禁用基本身份验证

如何在没有 oAuth 身份验证的情况下连接到 Google Calendar API?

如何在启用基本身份验证的情况下启用对 Web API 中所有来​​源的访问?