我为SystemAuthorityController
创建了一个测试类,因为我只需要加载部分上下文。
我使用了@WebMvcTest
注释,并指定了要测试的控制器(我也尝试了所有控制器,但也不起作用(。
@WebMvcTest(SystemAuthorityController.class)
@TestPropertySource("classpath:application.properties")
public class SystemAuthorityControllerTest
当我尝试从这个控制器调用任何端点时,我会得到404
,因为没有找到端点。
经过一番研究,我找到了解决方案,那就是用我需要的控制器添加@Import
注释,然后一切正常,URL就找到了。
@WebMvcTest(SystemAuthorityController.class)
@Import({SystemAuthorityController.class})
@TestPropertySource("classpath:application.properties")
public class SystemAuthorityControllerTest
我在这里的问题是为什么我需要显式导入我想测试的控制器,因为我从未见过这个注释被用于这个目的(我也不认为我应该这样使用(。根据我的理解,WebMvcTest
应该加载所有控制器bean。
若在同一模块中工作,则无需显式导入控制器。
如果你得了404分,可能是其他原因造成的。【需要查看日志】
这是ControllerTest的基本工作示例。[万一你错过了什么]
@RunWith(MockitoJUnitRunner.class)
@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class AControllerTest {
@InjectMocks
AController aController;
@Autowired
MockMvc mockMvc;
@Mock
AService aService;
@Before
public void setUp() {
this.mockMvc = MockMvcBuilders.standaloneSetup(aController).build();
}
@Test
public void aTest() throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
ADetails user = new ADetails();
user.setId("1234");
this.mockMvc.perform(MockMvcRequestBuilders.post("/a/signin").header("Referer", "test")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(user)))
.andExpect(MockMvcResultMatchers.status().is2xxSuccessful());
}