【问题标题】:JMockIt: Is it possible to mock same class twice, in the same TestClass, to verify behaviour in different scenariosJMockIt:是否可以在同一个TestClass中模拟同一个类两次,以验证不同场景中的行为
【发布时间】:2012-05-15 02:29:30
【问题描述】:

我需要编写一个测试,其中可以验证一个类的行为,用于模拟类的不同行为。为了支持同一方法的多种行为,我们需要在同一个 TestClass 中多次模拟该类。

可以使用 JMockIt 吗?

这是我想要的一个例子。这是要测试的主类及其测试:

public class MyClass {

    private Foo fooObj = null;

    public setfooObj(Foo obj) {
        fooObj = obj;
    }

    public boolean process() {
        // uses fooObj.getName() to process 
    }
}

public class MyClassTest {

    @MockClass(realClass = mypackage.Foo.class)
    public static class MockFoo {

        @Mock
        public static boolean getName() {
            return "test";
        }
    }

    @Test
    public void validateProcessing() {
        MyClass testObj = new MyClass();
        assertEquals(false, testObj.process);
    }
}

现在,我想验证testObj.process() 方法的行为,当MockFoo.getName() 返回不同的值时。对于我的第一个断言,我想将其值用作“测试”(由模拟函数返回),但对于以下断言,我想使用不同的值进行检查。

【问题讨论】:

  • 不清楚。有可能的。但我不知道你想要什么。
  • 这是我想要的一个例子。这是要测试的主要类。 public class MyClass { private Foo fooObj = null; public setfooObj(Foo obj) { fooObj = obj; } public boolean process() { // uses fooObj.getName() to process } } Test Class: public class MyClassTest{ MockClass(realClass = package.Foo.class) public static class MockFoo { Mock public static boolean getName() { return "test"; } } Test public void validateProcessing(){ MyClass testObj = new MyClass(); assertEquals(false, testObj.process); } }
  • @nnhthuan:请参考上面的代码。现在,我想验证 testObj.process() 方法的行为,当 MockFoo.getName() 返回不同的值时。对于我的第一个断言,我想将其值用作“测试”(由模拟函数返回),但对于以下断言,我想检查不同的值。请建议。谢谢!
  • 请将示例添加到问题中。我无法以这种格式阅读您的代码。

标签: mocking jmockit


【解决方案1】:

这很容易解决,不需要mock同一个类两次。要在不同的调用中从相同的模拟方法返回不同的值,如果使用“Expectations API”,只需记录两个(或更多)连续的返回值;如果使用“Mockups API”,请将“Invocation inv”类型的第一个参数添加到您的模拟方法中,然后使用“inv.getInvocationIndex()”来知道应该返回哪个值(不如其他选项好,但可以很好)。

有关更多文档和示例,请查看 JMockit 项目站点,或在完整发行版中的“jmockit/www”目录下。

【讨论】:

  • 谢谢@Rogerio。我选择了 Expectations API 解决方案。
【解决方案2】:

是的,您可以使用@Injectable 注释代替@Mocked,然后每个模拟将是一个单独的实例。您可以对这些实例执行不同的期望/验证。

来自the tutorial的示例:

@Test
public void concatenateInputStreams(
  @Injectable final InputStream input1,
  @Injectable final InputStream input2)
{
  new Expectations() {{
     input1.read(); returns(1, 2, -1);
     input2.read(); returns(3, -1);
  }};

  InputStream concatenatedInput = new ConcatenatingInputStream(input1, input2);
  byte[] buf = new byte[3];
  concatenatedInput.read(buf);

  assertArrayEquals(new byte[] {1, 2, 3}, buf);
}

【讨论】:

    猜你喜欢
    • 2013-04-28
    • 2015-11-07
    • 2019-11-17
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    相关资源
    最近更新 更多