从 Mockito 切换到 JMockit

NSF*_*NSF 4 java junit unit-testing jmockit mockito

我曾经依赖 Mockito,直到今天我有一个带有一些静态方法的最终类,所以我必须切换到 JMockit。我之前对此一无所知,所以问题是:如何将 Mockito 中的类似逻辑应用到 JMockit?

public final class ServiceData extends BaseData {

    private List<Data> data;

    public ServiceData(List<Data> data) {
         this.data = data;
         // something else
    }

    public static Container getContainer() {
         return super.getContainer();
    }

    public Data getDataAt(Index index) {
         return super.getContainer().get(index);
    }

}
Run Code Online (Sandbox Code Playgroud)

用 Mockito 编写的测试如下所示:

@Test
public void test() {
    ServiceData mockServiceData = mock(ServiceData.class);
    Data mockData = mock(Data.class);
    // only stubbing some of the methods
    Container mockContainer = spy(Container.class);
    doReturn(something).when(mockContainer.someMethod());
    when(mockServiceData.getContainer()).thenReturn(mockContainer);
    when(mockServiceData.getDataAt(any(Index.class)).thenReturn(mockData);

    // some assertions
}
Run Code Online (Sandbox Code Playgroud)

这将不起作用,因为 Mockito 不能模拟最终类或静态方法 (getContainer) 那么我如何在 JMockit 中编写相同的逻辑?谢谢。

Rog*_*rio 5

以下是示例测试的 JMockit 等效项:

@Test
public void test(
    @Mocked final ServiceData mockServiceData, @Mocked final Data mockData,
    @Mocked final Container mockContainer)
{
    // only stubbing some of the methods
    new Expectations(mockContainer) {{
        mockContainer.someMethod(); result = "something";
        mockServiceData.getContainer(); result = mockContainer;
        mockServiceData.getDataAt((Index) any); result = mockData;
    }};

    // some assertions
}
Run Code Online (Sandbox Code Playgroud)

要模拟static方法,语法是相同的,只是您要改写ServiceData.getContainer(); result = mockContainer;