在JMockit中,如何为一个已知参数(或模拟参数)设置一次被调用方法的期望值一次,但是如果它使用不同的参数调用该方法,则将其设置为失败。

即我想为Arg =“ XYZ”的时间= 1设置期望,但对于Arg!=“ XYZ”的任何其他方法的时间调用则为0。

这些期望的排序仅导致我的测试失败。我确实找到了一种方法来执行此操作,尽管对我来说这很麻烦,这是代码:

            obj.getDTOs(anyString);
            result = new Delegate() {
                    List<DTO> getDTOs(String testArg)
                    {
                        if (testArg.equals(expectedString)) {
                            return Collections.<DTO>emptyList();
                        } else {
                            throw new IllegalArgumentException();
                        }
                    }
            };
            result = Collections.<DTO>emptyList();
            times = 1;


这是最好的方法吗?

最佳答案

尽管可以使用Delegate完成以下操作,但仍可以使用:

static class Service {
    List<?> getDTOs(String s) { return null; }
}

@Test
public void example(@Mocked final Service obj) {
    new NonStrictExpectations() {{
        obj.getDTOs("XYZ"); times = 1; // empty list is the default result
        obj.getDTOs(withNotEqual("XYZ")); times = 0;
    }};

    assertEquals(0, obj.getDTOs("XYZ").size());
    obj.getDTOs("abc"); // fails with "unexpected invocation"
}

09-30 12:29