gpt4 book ai didi

unit-testing - Groovy 2.x 和 Mockito 不能很好地协同工作

转载 作者:行者123 更新时间:2023-12-04 04:35:31 24 4
gpt4 key购买 nike

我正在尝试为一些使用 Jersey 的代码编写一些单元测试访问 RESTful Web 服务,我正在使用 Mockito模拟一些东西。这是我的代码:

@Test
void test() {
given:
// WebResource is a Jersey/JAX-RS construct.
WebResource mockResource = Mockito.mock(WebResource)

// Address.groovy is a POJO from my project.
Address mockAddress = Mockito.mock(Address)

// THE NEXT LINE IS WHAT IS THROWING THE EXCEPTION:
Mockito.when(mockResource.get(Mockito.any())).thenReturn(mockAddress)

when:
<omitted for brevity>

then:
<omitted for brevity>
}

如您所见,每当 WebResource 尝试执行 HTTP GET 时,我试图强制 Jersey 返回我的 mockAddress 实例.

运行时我得到:

groovy.lang.GroovyRuntimeException: Ambiguous method overloading for method com.sun.jersey.api.client.WebResource$$EnhancerByMockitoWithCGLIB$$1c2e51fa#get.
Cannot resolve which method to invoke for [null] due to overlapping prototypes between:
[class com.sun.jersey.api.client.GenericType]
[class java.lang.Class]
at groovy.lang.MetaClassImpl.chooseMostSpecificParams(MetaClassImpl.java:3031)
at groovy.lang.MetaClassImpl.chooseMethodInternal(MetaClassImpl.java:2983)
at groovy.lang.MetaClassImpl.chooseMethod(MetaClassImpl.java:2926)
at groovy.lang.MetaClassImpl.getMethodWithCachingInternal(MetaClassImpl.java:1203)
at groovy.lang.MetaClassImpl.createPojoCallSite(MetaClassImpl.java:3130)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.createPojoSite(CallSiteArray.java:129)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:163)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at com.me.myapp.MyUnitTest.test(MyUnitTest.groovy:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
<large stack trace omitted for brevity>
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

MyUnitTest.groovy:19 是一行:

Mockito.when(mockResource.get(Mockito.any())).thenReturn(mockAddress)

关于正在发生的事情有什么想法吗?

最佳答案

WebResource's get() method is overloaded with get(Class) and get(GenericType) .

这似乎就是消息中描述的歧义所在。话虽如此,使用 Mockito.any() 似乎并不合适。我不是 Mockito 的大用户,所以我不知道使用它的正常用例。当我尝试将它与 Java 一起使用时,我会遇到编译错误,因为 Mockit.any() 将返回 Object,并且两个重载方法都不接受 对象作为参数。

话虽这么说,你正在 mock 的行为是,当你在 WebResource 上调用 get 时,它应该返回一个 Address 对象,所以你会想要传递 Address.class (或者在 Groovy 的情况下 Address 可能没问题,正如你在之前的帖子中提到的那样)到 获取方法。

应该工作的东西(至少当我用 Java 测试时)是这样的:

WebResource resource = Mockito.mock(WebResource.class);
Address address = Mockito.mock(Address.class);

Mockito.when(resource.get(Address.class)).thenReturn(address);
Mockito.when(address.toString()).thenReturn("Hello World");

Address a = resource.get(Address.class);
System.out.println(a);

这应该打印出 "Hello World"

关于unit-testing - Groovy 2.x 和 Mockito 不能很好地协同工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27335100/

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