我需要编写一个测试,其中可以验证一个类的行为,用于 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/