当前位置: 首页 > 知识库问答 >
问题:

使用EasyMock模拟方法

苍意智
2023-03-14

我尝试从以下方法创建单元测试,但我找不到一个解决方案来模拟每个方法内的调用,请您帮助我使用EasyMock为这些方法创建JUnit Test:

private static final WebServiceCache<JWebService> SERVICE = new WebServiceCache<>();
public int getCount() {
    int res = -1;
    try {
        String count = SERVICE.invokeSecurelly(new WS<String>() {
            @Override
            public String execute() throws Exception {
                return getWS().getList();
            }
        });
        res = Integer.parseInt(count);
    } catch (Exception e) {
        LOGGER.error("Count Exception" + e);
    }
    return res;
}

public int getKeyNumber() {
    int res = -1;
    try {
        String keyId = SERVICE.invokeSecurelly(new WS<String>() {
            @Override
            public String execute() throws Exception {
                return getWS().getID();
            }
        });
        
        res = Integer.parseInt(keyId);
    } catch (Exception e) {
        LOGGER.error("getKeyNumBer returns an error" + e);
    }
    return res;
}

提前感谢

共有1个答案

赫连彬炳
2023-03-14

要做一些干净的事情,需要进行一些重构以使其可测试。这就是我最终会得到的。。。猜测示例中缺少的核心部分。

public class MyClass {
    private static final Logger LOGGER = Logger.getLogger(MyClass.class.getName());
    private final WebServiceCache<JWebService> service;

    public MyClass(WebServiceCache<JWebService> service) {
        this.service = service;
    }
    
    private int getValue(Supplier<String> invoked) {
        try {
            String count = service.invokeSecurelly(invoked::get);
            return Integer.parseInt(count);
        } catch (Exception e) {
            LOGGER.error("Count Exception", e);
        }
        return -1;
    }

    public int getCount() {
        return getValue(() -> getWS().getList());
    }

    public int getKeyNumber() {
        return getValue(() -> getWS().getID());
    }

    private Stuff getWS() { // guessing where getWS() is
        return null;
    }
}

从那里开始,如果我们假设您要模拟的是getWS(),它将如下所示。

import org.easymock.EasyMockSupport;
import org.junit.Before;
import org.junit.Test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.easymock.EasyMock.expect;

public class MyClassTest extends EasyMockSupport {

    private WebServiceCache<JWebService> cache = new WebServiceCache<>();
    private MyClass tested = partialMockBuilder(MyClass.class)
            .addMockedMethod("getWS")
            .withConstructor(cache)
            .mock();
    private Stuff stuff = mock(Stuff.class);

    @Before
    public void before() {
        expect(tested.getWS()).andStubReturn(stuff);
    }

    @Test
    public void getCount() {
        expect(stuff.getList()).andStubReturn("8");
        replayAll();

        assertThat(tested.getCount()).isEqualTo(8);
    }

    @Test
    public void getKeyNumber() {
        expect(stuff.getID()).andStubReturn("8");
        replayAll();

        assertThat(tested.getKeyNumber()).isEqualTo(8);
    }
}
 类似资料:
  • 我正在尝试为以下类编写单元测试: 还有一些其他方法,但这个设置代码是与我的问题相关的。在单元测试中,我想模拟(使用EasyMock)对象以及它将返回的和对象: 当我尝试用JUnit运行它时,我得到以下错误: 在上没有我可以看到的公共变量。我是EasyMock的新手,所以我想我的问题是:对于我应该告诉我的mock返回什么,以及如何告诉它这样做?我根本不知道为什么设置代码会被调用,所以这是另一个谜。更

  • 我正在尝试使用EasyMock+PowerMock模拟静态方法。如果我没有模拟静态方法,那么我会得到异常java.lang.ExceptioninInitializerError,但它有一个不同的堆栈跟踪,这完全是由于我的代码文件造成的,错误是显而易见的。但是,如果我使用EasyMock+PowerMock模拟静态方法,则行PowerMock.MockStaticNice(ClassName.Cl

  • 问题内容: 是否可以使用EaskMock模拟具体的类?如果是这样,我该怎么办? 问题答案: 请参阅EasyMock类扩展文档,并从SourceForge项目下载它。但是,您不能模拟最终方法。 编辑:如注释中所述,这是EasyMock v3及更高版本的一部分。

  • 我有一堂这样的课: 我需要使用EasyMock模拟服务<代码>EasyMock。createMock()后跟replay()不起作用。P、 S:这是其他开发人员编写的遗留代码,我们不能在这里更改代码。

  • 我有以下场景: 我想在测试中覆盖公共方法methodA()的catch块。我不想更改私有方法的可见性。是否有任何方法可以使用EasyMock实现私有方法的部分模拟?或者有没有办法改变Junit类中私有方法的行为,以便在不使用mocking的情况下抛出异常? 提前谢谢。

  • 我有几个类遵循“模板方法”模式。抽象类A,具体扩展类B和C,如下所示: 我想编写一个测试来验证当getData()抛出某个Exception时是否抛出其他Exception。我真的希望避免模拟强制getData()抛出所需的所有复杂依赖关系。我不关心getData()如何抛出,我只想让它抛出。所以我想我要的是部分模拟。这就是我所拥有的: 这个测试在我看来很好,但当我运行它时,我得到了这样的结果: