【问题标题】:JMockit expectations API - return input parametersJMockit 期望 API - 返回输入参数
【发布时间】:2016-08-27 06:13:42
【问题描述】:

我知道,如果我想模拟一个方法并根据其输入为其分配特定行为,我可以使用 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") 的调用返回一个空的String(可能是某种默认值)。有什么办法吗?

【问题讨论】:

  • 你不能改变行为而不模拟它。您的第一个示例完全是多余的,只是示例代码吗?
  • 是的,这只是示例代码,但为什么它是多余的?真正的(假的)实现返回 null
  • 因为您没有测试任何生产代码。您基本上只是在测试您是否正确地模拟了它。无论您对生产代码进行什么更改,它都不会失败。
  • 是的,你在这件事上是对的,但这只是为了证明一点。 10x 用于清除它
  • A MockUp 也可以与 static 嵌套类一起使用,但也许你的意思是别的。使用Expectations,可以将返回接收到的参数的Delegate 对象分配给result。因此,在这种情况下,两个 API 都可以做对方可以做的任何事情。

标签: java unit-testing junit jmockit


【解决方案1】:

受到 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 类是 @FunctionalInterface (我知道这将在 JMockit 的下一个主要版本中发生),它看起来会好很多。 目前,这似乎是根据 Expectations API 中的输入参数模拟行为的唯一方法。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我希望结果与输入的值相同,而不是特别是“测试”
    • 在这种情况下,我认为您需要使用 MockUp(内联或其他方式)。在期望块中没有我知道的机制来捕获和返回参数值。您提到您不能将 MockUp 用于静态类。我不相信这实际上是这种情况,除非您的 jmockit 版本有一些我不知道的东西。我刚刚使用 1.19 版本为静态类编写了一个测试模拟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多