JMockit 期望 API - return 输入参数

JMockit expectations API - return input parameters

我知道如果我想模拟一个方法并根据其输入为其分配特定行为,我可以使用 MockUps API:

public class DuplicationTest {

    static class Duplicator {
        public String duplicate(String str) { return null; }
    }

    @Test
    public void verifySameStringReturnedWithMockupsAPI() throws Exception {
        new MockUp<Duplicator>() {
            @Mock public String duplicate(String str) { return str; }
        };

        Duplicator dup = new Duplicator();
        assertEquals("test", dup.duplicate("test"));
    }
}

此测试通过。
但是,有时我没有使用 MockUps API 的奢侈(例如,当模拟静态 类 时),因此我只能使用 Expectations API:

@Test
public void verifySameStringReturnedWithExpectationsAPI(@Mocked Duplicator dup) throws Exception {
    new Expectations() {{
        dup.duplicate(anyString); result = anyString;
    }};

    assertEquals("test", dup.duplicate("test"));
}

这显然失败了。调用 dup.duplicate("test") returns 一个空的 String (可能是某种默认值)。有什么解决办法吗?

在您的第二个示例中,它 return 是一个空字符串,因为您正在设置 result = anyString。 anyString 是一个 jmockit 对象,用于匹配任何可能的字符串值。您要做的是将结果设置为您实际想要的值 return,在本例中为 result = "test".

受 Rogério 的评论启发,我设法使用 Delegate:

解决了这个问题
@SuppressWarnings("unused")
@Test
public void verifySameStringReturnedWithExpectationsAPI(@Mocked Duplicator dup) throws Exception {
    new Expectations() {{
        dup.duplicate(anyString);
        result = new Delegate<String>() { String delegate(String str) { return str; }};
    }};

    assertEquals("test", dup.duplicate("test"));
    assertEquals("delegate did it", dup.duplicate("delegate did it"));
}

这不是最优雅的解决方案,如果 Delegate class 是 @FunctionalInterface(我知道这将在 JMockit 的下一个主要版本中发生). 目前,这似乎是根据 Expectations API.

中的输入参数模拟行为的唯一方法