需要模拟部分类时的单元测试

时间:2017-12-05 17:16:18

标签: java unit-testing junit mockito easymock

我有一个班级,我正在尝试进行单元测试。这个类扩展了另一个我目前对单元测试不感兴趣的类。

以下代码是我试图测试的代码的过度简化。

package com.example.somePackage;
public class ApiBase {
  protected <T extends SomeClass> t getApi(Class<T> apiClass) {/* some logic*/}
}


package com.example.anotherPackage;
public MagicApiImpl extends ApiBase {
  private final MagicApiHandler apiHandler = new MagicApiHandler();

  public String doSomeStuff(String someString) {
    final BookApi bookApi = getApi(BookApi.class);
    // some logic
    return apiHandler.someMethod(bookApi, someString);
  }
}

我想在doSomeStuff()上测试MagicApiImpl我要模仿的部分是getApi()中的内容。

刚开始我尝试简单地创建一个MagicApiImpl实例并设置所有幕后发生的事情,但是对于我想要测试的场景以及我需要在其他场景中测试它的次数开始变得过于复杂类。我将在自己的测试中处理getApi()中的逻辑测试。

使用EasyMock进行测试会很有帮助,因为这个项目的大部分测试都是用来编写的,但我不会过分使用mockito。

修改

好的,我正在阅读关于Mockito.spy()的内容。这本来很棒,但遗憾的是getApi受到保护并且在另一个包中。最糟糕的情况是,我可以放弃将所有测试放在该软件包中,但这使得跟踪代码变得困难。

1 个答案:

答案 0 :(得分:-1)

使用Easymock部分模拟测试应如下所示:

    @Test
    public void test() {
        MagicApiImpl impl = EasyMock.createMockBuilder(MagicApiImpl.class)
            .addMockedMethod("getApi")
            .createMock();
        EasyMock.expect(impl.getApi(BookApi.class)).andReturn(/**Wharever you need*/);
        EasyMock.replay(impl);
        String input = "INPUT";
        String output = impl.doSomeStuff(input);
        System.out.println("The OUTPUT is: " + output);
        EasyMock.verify(impl);
        //Run asserts here
    }

参考:http://easymock.org/user-guide.html#mocking-partial