gpt4 book ai didi

java - Mockito 中的 ClassCastException

转载 作者:搜寻专家 更新时间:2023-11-01 03:34:34 25 4
gpt4 key购买 nike

我有以下方法,我正在尝试使用 Mockito 为其编写单元测试。我是 Mockito 的新手,正在努力 catch 。

测试方法

public synchronized String executeReadRequest(String url) throws Exception{

String result = null;
RestClient client = null;
Resource res = null;
logger.debug("Start executing GET request on "+url);

try{
client = getClient();
res = client.resource(url);
result = res.contentType(this.requestType).accept(this.responseType).get(String.class);
}
catch(Exception ioe){
throw new Exception(ioe.getMessage());
}
finally{
res = null;
client = null;
}

logger.info("GET request execution is over with result : "+result);
return result;
}

使用 Mockito 进行单元测试

@Test
public void testRestHandler() throws Exception {
RestHandler handler = spy(new RestHandler());
RestClient mockClient = Mockito.mock(RestClient.class,Mockito.RETURNS_DEEP_STUBS);
Resource mockResource = Mockito.mock(Resource.class,Mockito.RETURNS_DEEP_STUBS);

doReturn(mockClient).when(handler).getClient();
Mockito.when(mockClient.resource(Mockito.anyString())).thenReturn(mockResource);

//ClassCastException at the below line
Mockito.when(mockResource.contentType(Mockito.anyString()).accept(Mockito.anyString()).get(Mockito.eq(String.class))).thenReturn("dummy read result");

handler.setRequestType(MediaType.APPLICATION_FORM_URLENCODED);
handler.setResponseType(MediaType.APPLICATION_JSON);
handler.executeReadRequest("abc");
}

但是我在行中遇到了 ClassCastException

Mockito.when(mockResource.contentType(Mockito.anyString()).accept(Mockito.anyString()).get(Mockito.eq(String.class))).thenReturn("dummy read result");

异常

java.lang.ClassCastException: org.mockito.internal.creation.jmock.ClassImposterizer$ClassWithSuperclassToWorkAroundCglibBug$$EnhancerByMockitoWithCGLIB$$4b441c4d cannot be cast to java.lang.String

感谢解决此问题的任何帮助。

非常感谢。

最佳答案

stub 期间的这种链接方式是不正确的:

Mockito.when(
mockResource.contentType(Mockito.anyString())
.accept(Mockito.anyString())
.get(Mockito.eq(String.class)))
.thenReturn("dummy read result");

即使您已将模拟设置为返回深度 stub ,Matchers work via side-effects ,所以这条线没有达到你认为的效果。所有三个匹配器(anyStringanyStringeq)都在调用 when 期间进行评估,并且您有了它,您的代码可能会在最轻微的挑衅时抛出 InvalidUseOfMatchersException——包括稍后添加不相关的代码或验证。

这意味着您的问题不是 eq(String.class) 的使用:这是 Mockito 试图在它不适用的地方使用类匹配器属于。

相反,您需要专门 stub :

Mockito.when(mockResource.contentType(Mockito.anyString()))
.thenReturn(mockResource);
Mockito.when(mockResource.accept(Mockito.anyString()))
.thenReturn(mockResource);
Mockito.when(mockResource.get(Mockito.eq(String.class))) // or any(Class.class)
.thenReturn("dummy read response");

请注意,这里的一些困难是 Apache Wink使用 Builder 模式,这在 Mockito 中可能很费力。 (我在这里返回了 mockResource,但你可以想象返回特定的其他 Resource 对象,代价是稍后需要它们完全按照那个顺序。)更好的方法可能是 use a default Answer that returns this whenever possible .

关于java - Mockito 中的 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35099282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com