如何在没有基本 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 手动验证客户端证书?