mocking - JMockIt:是否可以在同一个 TestClass 中模拟同一个类两次,以验证不同场景中的行为

标签 mocking jmockit

我需要编写一个测试,其中可以验证一个类的行为,用于 Mocked 类的不同行为。为了支持同一方法的多种行为,我们需要在同一个 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);
    }
}

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

最佳答案

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

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

关于mocking - JMockIt:是否可以在同一个 TestClass 中模拟同一个类两次,以验证不同场景中的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10593453/

相关文章:

java - 计算单元测试中的方法调用次数

testing - 试图在 Flask-SQLAlchemy 中模拟模型的问题

java - HttpSession 联合测试

android - 如何在Android Studio中解析 "multiple dex files define Lorg/junit/runner/Runner"

java - 验证静态外部类的私有(private)静态嵌套类的非静态方法的调用

java - 模拟多次调用的静态方法

java - 如何模拟 Dao 两次但使用同一个对象调用?

Python 测试 : Simulate ImportError

unit-testing - Mockito 内部结构

java - 如何创建一个不使用 jmockit 的虚拟实例?