单位测试需要嘲笑一部分的一部分



我有一个我试图单位测试的类。该课程扩展了我目前对单元测试不感兴趣的另一个课程。

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

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);
  }
}

我想在MagicApiImpl上测试doSomeStuff(),我想模拟的部分是getApi()中回来的。

首先,我尝试简单地创建一个magicapiimpl的实例,并设置所有发生的幕后事物,但在我要测试的情况下开始变得过于复杂,以及我需要在其他情况下进行测试的次数课程。我将在其自己的测试中处理getApi()中逻辑的测试。

使用EasyMock对此进行测试将很有帮助,因为这是该项目的大多数测试都编写的,但我不会过分地使用Mockito。

编辑

好吧,我正在阅读有关Mockito.spy()的信息,这本来是很棒的,但可悲的是,Getapi受到了保护,并在另一个包裹中受到保护。最糟糕的情况,我可以重新将所有测试放在该软件包中,但这使得它很难跟踪代码。

使用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

相关内容

  • 没有找到相关文章

最新更新