简易模拟 - 怎么样?

时间:2015-04-07 12:29:19

标签: testing junit mocking easymock

我正在尝试使用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)

任何想法是错的还是如何使用简单的模拟?没有好的文档或示例。

1 个答案:

答案 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));