【问题标题】:Unable to throw an exception when testing a controller class in JUnit5在 JUnit5 中测试控制器类时无法抛出异常
【发布时间】: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 方法我们必须使用不同的语法。所以我改变了它。然后我尝试了一些带有不同注释的东西,但无法让它工作。

我期待抛出异常,但得到 200.

【问题讨论】:

  • 请不要使用纯文本的屏幕截图 - 而是 c&p 堆栈跟踪

标签: java spring-boot unit-testing mockito junit5


【解决方案1】:

如果您希望 TokenValidator 作为服务工作,请不要模拟它。

 @Autowired
private TokenValidator tokenValidator;

或模拟为 bean,手动抛出异常

 @MockBean
private TokenValidator tokenValidator;

...
doThrow(new Exception()).when(tokenValidator).validateUser(authToken, userId);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2020-08-18
    • 2013-09-08
    • 1970-01-01
    相关资源
    最近更新 更多