从Mockito切换到JMockit

4

我曾经依赖于Mockito,但今天遇到一个包含一些静态方法的final类,所以我不得不转向JMockit。在此之前,我对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);
    }

}

在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
}

由于Mockito无法mock final类或静态方法(getContainer),所以这不起作用。那么我该如何在JMockit中编写相同的逻辑呢?谢谢。


1
通常情况下,当Mockito阻止某些操作时,这表明存在设计问题。为什么getDataAt依赖于父类的静态方法?你为什么要首先尝试模拟ServiceData - Thorn G
好观点。但本质上这不是一个真正的类,而是我故意为了这个问题写下的一个虚假类。该类显然没有遵循一些设计规则。目的是为了获得如何迁移代码的想法。 :) - NSF
1个回答

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
}

要模拟static方法,语法相同,但你需要写ServiceData.getContainer(); result = mockContainer;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接