如何在Spock中使用jmockit来测试返回多个不同值的静态方法



我想使用jmockit来测试Spock中的静态方法,并结合where标记来实现每个mock的不同值,以测试不同的业务逻辑。我尝试了很多写作方法,但都失败了。我希望我能在这里得到帮助或建议。非常感谢

以下是我的业务代码示例:

public class MyUtils {
public static int staticMethod(int origin) {
return 0;
}
}
public class MyClass {    
public void verify(int origin) {
if (MyUtils.staticMethod(origin) == 1) {
System.out.println("1");
}
if (MyUtils.staticMethod(origin) == 2) {
System.out.println("2");
}
...
}
}

这是我的斯波克测试代码:

def "verify"() {
when:
myClass.verify(0)
then:
true
where:
mock | _
mockStatic(1) | _
mockStatic(2) | _
}
def mockStatic(val){
new MockUp<MyUtils>() {
@Mock
public int staticMethod(int origin) {
return val
}
}
}

我知道power可以实现这样的功能,但由于我们的团队一直在使用jmockit,我们想知道jmockit是否可以在Spock中实现mock的多个不同值?

将方法调用放入闭包中,并在每次迭代中评估闭包:

package de.scrum_master.stackoverflow.q67882559
import mockit.Mock
import mockit.MockUp
import mockit.internal.state.SavePoint
import spock.lang.Requires
import spock.lang.Specification
import spock.lang.Unroll
class StaticMethodJMockitTest extends Specification {
def jMockitSavePoint = new SavePoint()
def cleanup() {
jMockitSavePoint.rollback()
}
@Unroll
def "verify"() {
given:
mockClosure()
MyClass myClass = new MyClass()
when:
myClass.verify(0)
then:
true
where:
mockClosure << [
{ /* no mock */ },
{ mockStatic(1) },
{ mockStatic(2) }
]
}
def mockStatic(val) {
new MockUp<MyUtils>() {
@Mock
int staticMethod(int origin) {
return val
}
}
}
public static class MyUtils {
public static int staticMethod(int origin) {
return 0;
}
}
public static class MyClass {
public void verify(int origin) {
if (MyUtils.staticMethod(origin) == 1) {
System.out.println("1");
}
if (MyUtils.staticMethod(origin) == 2) {
System.out.println("2");
}
}
}
}

如果希望使用数据表,则需要通过在闭包中显式添加it ->(如果闭包位于数据表的第一列(来帮助解析器。您还可以为展开的迭代使用一些不错的命名:

@Unroll
def "verify #description"() {
given:
mockClosure()
MyClass myClass = new MyClass()
when:
myClass.verify(0)
then:
true
where:
description     | mockClosure
"no mock"       | { /* no mock */ }
"mock result 1" | { mockStatic(1) }
"mock result 2" | { mockStatic(2) }
}

创建并回滚保存点的原因是,在模拟生命周期方面,JMockit与Spock的配合并不好,维护人员甚至无意考虑提供帮助。有关更多信息,请参阅JMockit第668期。

最新更新