2017-03-10 11 views
0

内部インターフェイスからモックを作成する際に問題があります。Easymock - 内部クラス/インタフェースをモックする

私はので、私は方法を以下でこれを行っているjavax.ws.rs.client

からのHttpClientを模擬したいと思います。

mockedClient = createMock(Client.class); 
webTarget = createMock(WebTarget.class); 
Invocation.Builder builder = createMock(Invocation.Builder.class); //<-error 
response = createMock(Response.class); 

EasyMockを使用してどのようにしたらいいですか? 私はこのインタフェースを実装し、実装で使用するメソッドを嘲笑します。それはよい回避策ですか?

どのようにこのインターフェイスの外観のように:

// 
// Source code recreated from a .class file by IntelliJ IDEA 
// (powered by Fernflower decompiler) 
// 

package javax.ws.rs.client; 

import java.util.Locale; 
import java.util.concurrent.Future; 
import javax.ws.rs.client.AsyncInvoker; 
import javax.ws.rs.client.Entity; 
import javax.ws.rs.client.InvocationCallback; 
import javax.ws.rs.client.SyncInvoker; 
import javax.ws.rs.core.CacheControl; 
import javax.ws.rs.core.Cookie; 
import javax.ws.rs.core.GenericType; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.MultivaluedMap; 
import javax.ws.rs.core.Response; 

public interface Invocation { 
    Invocation property(String var1, Object var2); 

    Response invoke(); 

    <T> T invoke(Class<T> var1); 

    <T> T invoke(GenericType<T> var1); 

    Future<Response> submit(); 

    <T> Future<T> submit(Class<T> var1); 

    <T> Future<T> submit(GenericType<T> var1); 

    <T> Future<T> submit(InvocationCallback<T> var1); 

    public interface Builder extends SyncInvoker { 
     Invocation build(String var1); 

     Invocation build(String var1, Entity<?> var2); 

     Invocation buildGet(); 

     Invocation buildDelete(); 

     Invocation buildPost(Entity<?> var1); 

     Invocation buildPut(Entity<?> var1); 

     AsyncInvoker async(); 

     Invocation.Builder accept(String... var1); 

     Invocation.Builder accept(MediaType... var1); 

     Invocation.Builder acceptLanguage(Locale... var1); 

     Invocation.Builder acceptLanguage(String... var1); 

     Invocation.Builder acceptEncoding(String... var1); 

     Invocation.Builder cookie(Cookie var1); 

     Invocation.Builder cookie(String var1, String var2); 

     Invocation.Builder cacheControl(CacheControl var1); 

     Invocation.Builder header(String var1, Object var2); 

     Invocation.Builder headers(MultivaluedMap<String, Object> var1); 

     Invocation.Builder property(String var1, Object var2); 
    } 
} 

コンソールからの例外:

java.lang.ExceptionInInitializerError 
at java.lang.J9VMInternals.initialize(J9VMInternals.java:258) 
at java.lang.Class.forNameImpl(Native Method) 
at java.lang.Class.forName(Class.java:182) 
at com.sun.proxy.$Proxy16.<clinit>(Unknown Source) 
at java.lang.J9VMInternals.initializeImpl(Native Method) 
at java.lang.J9VMInternals.initialize(J9VMInternals.java:236) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:80) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:57) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:539) 
at java.lang.reflect.Proxy.newInstance(Proxy.java:753) 
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:744) 
at org.easymock.internal.JavaProxyFactory.createProxy(JavaProxyFactory.java:30) 
at org.easymock.internal.MocksControl.createMock(MocksControl.java:113) 
at org.easymock.internal.MocksControl.createMock(MocksControl.java:94) 
at org.easymock.EasyMock.niceMock(EasyMock.java:181) 
at org.easymock.EasyMock.createNiceMock(EasyMock.java:349) 
at 
at 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55) 
at java.lang.reflect.Method.invoke(Method.java:613) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51) 
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:237) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl 
at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:152) 
at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:120) 
at javax.ws.rs.core.Cookie.<clinit>(Cookie.java:61) 
at java.lang.J9VMInternals.initializeImpl(Native Method) 
at java.lang.J9VMInternals.initialize(J9VMInternals.java:236) 
... 41 more Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl 
at java.lang.Class.forName(Class.java:182) 
at javax.ws.rs.ext.FactoryFinder.newInstance(FactoryFinder.java:114) 
at javax.ws.rs.ext.FactoryFinder.find(FactoryFinder.java:207) 
at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:135) 
... 45 more 

編集:

私はこのようにこのオブジェクトを投影しあざけりするmockitoを追加します。

Invocation.Builder builder = mock(Invocation.Builder.class); 

それは動作します!

なぜ、このモックがEasyMockで動作しないのですか?

+0

内部インターフェイスを移動してから黙っている方が簡単でしょうか? – byxor

+0

また、コードの画像ではなく、コードを投稿してください。 – byxor

+0

しかし、このインターフェイスは私の実装ではなく、Javaライブラリ内にあります:) – przemoW

答えて

0

Invocation.Builderは、CacheControlというクラスを使用しています。このクラスには、RuntimeDelegate.getInstance()という静的フィールドがあります。したがって、RuntimeDelegateが必要です。デフォルトのRuntimeDelegateorg.glassfish.jersey.internal.RuntimeDelegateImplです。これはクラスパスにありません。だからあなたはそれにClassNotFoundExceptionを手に入れます。

奇妙な理由でMockitoが動作します。彼らはByteBuddyを使ってモックを実装します。これは何らかの理由でCacheControlをロードする必要はありません。

EasyMockモックインターフェイスProxy.newProxyInstanceを使用しています。これは、ロードCacheControlのようです。だから失敗する。

しかし、builder.cacheControl(new CacheControl());をMockitoと呼ぶと、同じエラーが発生します。

関連する問題