我写一个Spring Boot应用程序,我能访问和测试Controller用MockMvc。问题在于,在测试过程中未强制执行安全性,并且我无法Controller在没有用户的情况下访问。
Spring Boot
Controller
MockMvc
我做错什么了吗?它是预期的行为吗?
ControllerTest 类:
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()); } }
您的示例使用普通的单元测试来测试您的控制器。在此设置中,控制器由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