微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在 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");
        }
        ...
    }
}

这是我的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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。