【问题标题】:EasyMock 2.5 doesn't work for more than one argument captureEasyMock 2.5 不能用于多个参数捕获
【发布时间】:2012-04-05 23:16:53
【问题描述】:

当我尝试使用 EasyMock 捕获多个值时出现异常。

easymock 2.5.2
easymockclassextension 2.2
mockito-all 1.8.5
hamcrest-all 1.1

如何使用 EasyMock 解决?

初始代码:

package easymock;

public class User {
    public static final int INT_VALUE = 1;
    public static final boolean BOOLEAN_VALUE = false;
    public static final String STRING_VALUE = "";
    private Service service;

    public void setService(Service service) {
        this.service = service;
    }

    public String userMethod(){
        return service.doSomething(INT_VALUE, BOOLEAN_VALUE, STRING_VALUE);
    }
}


package easymock;

public class Service {
    public String doSomething(Integer a, boolean b, String c){
        return null;
    }
}


package easymock;

import org.easymock.Capture;
import org.easymock.classextension.EasyMock;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;

import static org.easymock.EasyMock.anyBoolean;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.classextension.EasyMock.capture;
import static org.easymock.classextension.EasyMock.expect;
import static org.easymock.classextension.EasyMock.replay;
import static org.easymock.classextension.EasyMock.verify;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class UserTest {

    private User user;
    private Service easyMockNiceMock;
    private Service mockitoMock;

    @Before
    public void setUp() throws Exception {
        user = new User();
        easyMockNiceMock = EasyMock.createNiceMock(Service.class);
        mockitoMock = mock(Service.class);
    }

    @Test
    public void easyMockTest() throws Exception {
        // given
        user.setService(easyMockNiceMock);

        Capture<Integer> integerCapture = new Capture<Integer>();
        Capture<Boolean> booleanCapture = new Capture<Boolean>();
        Capture<String> stringCapture = new Capture<String>();
        expect(easyMockNiceMock.doSomething(capture(integerCapture), capture(booleanCapture), capture(stringCapture))).andReturn("");
        replay(easyMockNiceMock);
        // when
        user.userMethod();
        // then
        verify(easyMockNiceMock);
        assertThat(integerCapture.getValue(), is(User.INT_VALUE));
        assertThat(booleanCapture.getValue(), is(User.BOOLEAN_VALUE));
        assertThat(stringCapture.getValue(), is(User.STRING_VALUE));
    }

    @Test
    public void easyMockTestValid() throws Exception {
        // given
        user.setService(easyMockNiceMock);

        Capture<Integer> integerCapture = new Capture<Integer>();
        expect(easyMockNiceMock.doSomething(capture(integerCapture), anyBoolean(), (String) anyObject())).andReturn("");
        replay(easyMockNiceMock);
        // when
        user.userMethod();
        // then
        verify(easyMockNiceMock);
        assertThat(integerCapture.getValue(), is(User.INT_VALUE));
    }

    @Test
    public void mockitoTest() throws Exception {
        // given
        user.setService(mockitoMock);

        ArgumentCaptor<Integer> integerArgumentCaptor = ArgumentCaptor.forClass(Integer.class);
        ArgumentCaptor<Boolean> booleanArgumentCaptor = ArgumentCaptor.forClass(Boolean.class);
        ArgumentCaptor<String> stringArgumentCaptor = ArgumentCaptor.forClass(String.class);

        when(mockitoMock.doSomething(integerArgumentCaptor.capture(), booleanArgumentCaptor.capture(), stringArgumentCaptor.capture())).thenReturn("");
        // when
        user.userMethod();
        // then
        assertThat(integerArgumentCaptor.getValue(), is(User.INT_VALUE));
        assertThat(booleanArgumentCaptor.getValue(), is(User.BOOLEAN_VALUE));
        assertThat(stringArgumentCaptor.getValue(), is(User.STRING_VALUE));
    }
}

测试结果:

  1. mockitoTest - 总是通过
  2. easyMockTestValid - 如果在没有 easyMockTest 的情况下运行,则通过
  3. easyMockTest - 总是失败并显示消息:


java.lang.NullPointerException
        at easymock.UserTest.easyMockTest(UserTest.java:41)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
        at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
        at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:71)
        at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:202)
        at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

【问题讨论】:

    标签: java mockito easymock


    【解决方案1】:

    首先,您使用的是不同版本的 EasyMock 和 EasyMock 类扩展。我不认为你的情况有这个问题,但我宁愿建议你有连贯的版本。

    其次,我使用 EasyMock 3.1 版尝试了您的代码,不再需要类扩展,并且测试通过了。不过,我在更改日志中没有看到任何有趣的内容,Henri 可能会更改代码中的某些内容,从而使您的代码正常工作。

    希望对您有所帮助。

    【讨论】:

    • 不同版本的EM和classextension没有问题。错误在 easymock 2.5 本身中。在 3.1 中它可以正常工作,但由于兼容性问题,我不会考虑从 2.5 迁移到 3.1。
    • 好的,如果你解决了这个问题,那就太好了 :) 关于不同的版本,在这种情况下这可能不是问题,尽管许多工具库发布了一起工作的组件,然后使用相同的版本。另外你能开发2.5和3.1之间的兼容性问题吗,如果你现在不更新,你以后可能会被抓到,这可能是技术债。
    • 是的,我已经遇到了兼容性问题,请在此处查看我的评论stackoverflow.com/a/10049643/1063824
    • 其实关于classextension,maven上有,找org.easymock:easymockclassextension:3.1。尽管我强烈建议您升级您的代码并删除该依赖项,因为 EasyMock 和 EasyMock CE 已合并。请注意,随着时间的推移和发布,项目更改他们的 API 或其中的一部分是正常的,但让它变得轻松是一个真正的挑战,API 设计真的很困难。有时你会遇到障碍,这就是为什么主要版本会引入破坏性的 API 更改。无论如何,祝你工作顺利。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    相关资源
    最近更新 更多