使用来自 Mockito Junit 测试的自定义消息引发异常

问题描述

try {
        response = restTemplate.postForEntity(endPoint,request,Object.class);
        lOGGER.info("response is " + response);
        
    } catch (Exception e) {
        lOGGER.error("Exception :" + e.getMessage());
        if ((e.getMessage().contains("401") || e.getMessage().contains("Unauthorized")) ) {
            ServiceImpl.evictTokenCache("authToken");
            getData(requestDto);
        } else {
            throw new CustomException(e.getMessage());
        }

以上是我的服务并尝试为 catch 子句编写测试用例,而我的测试用例是

@test()
public void getExceptiontest() throws Exception {
    RequestDto requestDto = new RequestDto();
    requestDto.setPage("1");
    AuthConfig authDTO = new AuthConfig();
    authDTO.setUrl("Url");
    Mockito.when(restTemplate.postForEntity(Mockito.anyString(),Mockito.any(),Mockito.any())).thenThrow((new Exception("Unauthorized")));
    ResponseDTO response = restCallUtil.getData(requestDto);
    assertNull(response);
}

我想要做的 incatch 块是,每当我遇到未经授权的异常时,我都会清除缓存并再次调用相同的方法。因此,为了从我的测试类中测试 catch 块,我试图抛出异常,消息为“未经授权”,但是当我运行测试用例时,我得到了

org.mockito.exceptions.base.MockitoException:
Checked 异常对该方法无效!
无效:java.lang.Exception:未经授权

解决方法

首先要注意的是 useEffect(() => { fetch("/posts") .then((res) => { return res.json(); }) .then((data) => { console.log(data); setProducts(data); }); },[]); 的实例不是 Exception 的实例是 checked 异常。因此,方法抛出泛型 RuntimeException 的唯一方法是方法签名包含“Exception”或“throws Exception”。

那么..你为什么会收到这个错误?您正在存根抛出 throws ThrowablepostForEntity 方法,而 RestClientException 不是 Exception 的实例。因此,您的存根无效。

如果您想存根该方法以便输入通用案例​​的 catch 块,您将需要抛出一个 RestClientException,它未选中,因此不受“抛出”限制。

也就是说,在原始方法中仅捕获 RestClientException 可能更明智。如果您想捕获某个 RuntimeException,那么您可能已经知道它是什么并专门捕获它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...