如何使用times为JMockit设置链式调用的预期结果?
解决JMockit部分模拟中指定链式返回结果的问题
我明白你遇到的困扰了——在使用JMockit对server类做部分模拟时,你希望readPortNumber方法前300次调用抛出FileNotFoundException,第301次调用成功返回100,但直接重复设置result和times的写法会让后面的配置覆盖前面的,导致首次调用就返回100,完全不符合预期。
问题根源
你最初尝试的写法存在一个关键问题:在同一个Expectations块中,对同一个方法调用重复赋值result和times时,后面的赋值会直接覆盖前面的配置。所以JMockit最终只会生效最后一次的设置(返回100,仅调用1次),这就是为什么首次调用就返回了100。
正确的实现方式
JMockit支持通过数组形式为同一个方法调用指定多组结果和对应的调用次数,数组中的元素会按顺序一一匹配。你可以这样写:
new Expectations(server) {{ server.readPortNumber(withInstanceOf(File.class)); // 第一个元素对应前300次抛出的异常,第二个元素对应第301次返回的值 result = new FileNotFoundException(), 100; // 第一个数值对应第一个结果的调用次数,第二个数值对应第二个结果的调用次数 times = 300, 1; }}
写法说明
result数组中的元素按顺序定义了方法调用的返回/抛出结果:前300次调用会抛出FileNotFoundException,第301次调用会返回100。times数组中的数值与result数组一一对应:300对应第一个结果的调用次数,1对应第二个结果的调用次数。- 这种写法会让JMockit严格按照你定义的顺序和次数来执行方法的模拟行为,完全符合你的需求。
内容的提问来源于stack exchange,提问作者mvallebr
相关产品推荐
相关产品推荐

