【发布时间】:2023-02-06 15:02:55
【问题描述】:
我是 junit 的新手,正在编写一些测试用例来测试我的 springboot 控制器。在我的控制器中有一个帮助程序类,我试图使用它来调用 validateToken 方法,并且我期望此方法出现自定义异常。但出于某种原因,它只是跳过该行并向我返回 200 Ok 响应,就像成功执行的情况一样。我期待 400 错误的请求,但得到 200 Ok 响应。
validateToken 是一个 void 方法。
测试类
@SpringBootTest
@RunWith(MockitoJUnitRunner.class)
@AutoConfigureMockMvc
class GetUserAddressControllerTest {
@Mock
private CustomerAddressService customerAddressService;
@Mock
private TokenValidator tokenValidator;
@InjectMocks
private GetUserAddressController getUserAddressController;
@Autowired
private MockMvc mockMvc;
@BeforeEach
void setup() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.standaloneSetup(getUserAddressController).build();
}
@Test
void getAllAddressesFailureTest() throws Exception {
doThrow(new AddressBookException(RestResultCode.BAD_REQUEST, ErrorType.UNAUTHORIZED_ERROR.getStatus(), "Access is denied"))
.when(tokenValidator)
.validateUser(header, userId);
mockMvc = MockMvcBuilders.standaloneSetup(getUserAddressController).build();
MvcResult mvcResult = mockMvc.perform(get(getAddressUrl)
.param("userId", userId)
.header("Authorization", header))
.andDo(MockMvcResultHandlers.print())
.andExpect(status().is4xxClientError())
.andReturn();
verify(customerAddressService).getAllAddresses(any());
}
控制器类
@ApiOperation(value = "This API will fetch all address for a user")
@GetMapping(value = "/addresses", produces = MediaType.APPLICATION_JSON_VALUE)
CustomerAddressResponse getAllAddresses(@RequestHeader(value = "Authorization", required = true) String authToken,
@RequestParam("userId") String userId) {
tokenValidator.validateUser(authToken, userId); //----> want exception
return customerAddressService.getAllAddresses(userId);
}
TokenValidator 类
public void validateUser(String authToken, String uuid) {
if (StringUtils.isEmpty(authToken)) {
throw new AddressBookException(RestResultCode.UNAUTHORIZED, ErrorType.ACCESS_DENIED_ERROR.getStatus(), "Access is denied");
}
// some logic here
}
}
早些时候我使用的是 when().thenThrow() 语法,但后来知道对于 void 方法我们必须使用不同的语法。所以我改变了它。然后我尝试了一些带有不同注释的东西,但无法让它工作。
【问题讨论】:
-
请不要使用纯文本的屏幕截图 - 而是 c&p 堆栈跟踪
标签: java spring-boot unit-testing mockito junit5