问题描述
我想用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");
}
...
}
}
这是我的Spock测试代码:
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 issue #668。