我正在尝试使用easyMock测试几个类/接口方法。带参数的方法,试图捕获参数,但得到一个或其他错误。如果我设法只记录一个期望,它甚至不会捕获参数管道中的任何内容,如果我使用以下方法,我会收到如下错误代码。
@Test
public void testFireChannelInitializer() throws Exception
{
expect(c.pipeline()).andReturn(pipeline).times(1);
channelListener.fireChannelInitializer(EasyMock.capture(pipe), serverHandler);
EasyMock.replay(c, pipeline, channelListener);
initializer.initChannel(c);
verifyAll();
assertEquals(4, pipe.getValues().size());
assertTrue(pipe.getValues().get(0) instanceof LoggingHandler);
assertTrue(pipe.getValues().get(0) instanceof ObjectEncoder);
assertTrue(pipe.getValues().get(0) instanceof ObjectDecoder);
assertTrue(pipe.getValues().get(0) instanceof ServerHandler);
}
导致错误
testFireChannelInitializer(com.obolus.generic.impl.DefaultChannelListenerTest) 经过的时间:3.812秒<<<错误! java.lang.IllegalStateException:2 匹配者预计,1记录。此异常通常发生在 在记录方法时,匹配器与原始值混合:foo(5, 当量(6)); //错误你根本不需要使用匹配器或匹配器 每一个参数:foo(eq(5),eq(6)); //右foo(5,6); //也 就在 org.easymock.internal.ExpectedInvocation.createMissingMatchers(ExpectedInvocation.java:51) 在 org.easymock.internal.ExpectedInvocation。(ExpectedInvocation.java:40) 在org.easymock.internal.RecordState.invoke(RecordState.java:78)at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:40) 在 org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:94) 在 org.easymock.internal.ClassProxyFactory $ MockMethodInterceptor.intercept(ClassProxyFactory.java:97) 在 com.obolus.generic.impl.DefaultChannelListener $$ EnhancerByCGLIB $$ 2da02970.fireChannelInitializer() 在 com.obolus.generic.impl.DefaultChannelListenerTest.testFireChannelInitializer(DefaultChannelListenerTest.java:63) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:483)at org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:45) 在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 在 org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 在 org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 在org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:231)at org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:60)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)at at org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:50)at org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:222)at at org.junit.runners.ParentRunner.run(ParentRunner.java:300)at at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:242) 在 org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:137) 在 org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:483)at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) 在 org.apache.maven.surefire.booter.ProviderFactory $ ProviderProxy.invoke(ProviderFactory.java:165) 在 org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) 在 org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115) 在 org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
任何想法是错的还是如何使用简单的模拟?没有好的文档或示例。
答案 0 :(得分:1)
easymock网站有一个user guide,但他们最近重新编写了网站,指南并不像以前那样完整。
我认为您的问题可能是您需要捕获和参数匹配器。
来自用户指南:
匹配任何值,但在Capture参数中捕获它以供以后访问。您可以执行和(someMatcher(...),capture(c))从特定的方法调用中捕获参数。您还可以指定CaptureType,告知给定的Capture应保留第一个,最后一个,全部或没有捕获的值。
所以你可能需要做一个and( capture(..), paramMatcher)
EasyMock也有一个烦人的API"功能"如果在方法调用中使用一个参数匹配器,那么所有参数也必须包含在匹配器中,即使它是eq()
。我认为这是你的例外所抱怨的。所以我认为这是你的两个问题。
我不确定你的方法签名是什么样的,所以我会假设它
void fireChannelInitializer(Object, ServerHandler);
使用静态导入导入EasyMock.*
channelListener.fireChannelInitializer(
and(capture(pipe), isA(Object.class)), //captures the argument to `pipe` Capture object
eq(serverHandler));