使用GroovyMock或Spock中的类似方法来模拟静态方法 [英] Mock static method with GroovyMock or similar in Spock

查看:2704
本文介绍了使用GroovyMock或Spock中的类似方法来模拟静态方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这里的第一次,如果我错过了任何事情,我很抱歉。
我希望能够绕过使用Spock的静态方法。反馈会很好



随着groovy mock,我想我能够通过静态调用,但没有找到它。
对于后台,我正在对遗留java中的测试进行加装。重构是被禁止的。



对静态方法的调用与这种形式的实例调用链接在一起:

$ b $我使用spock-0.7和groovy-1.8。 b

  public class ClassUnderTest {

public void methodUnderTest(Parameter param){
// everything everything commented out
事情someThing = ClassWithStatic.staticMethodThatReturnsAnInstance()。instanceMethod(param);







staticMethod返回一个ClassWithStatic
instanceMethod返回方法其余部分需要的东西



如果我直接运行全局模拟,它会返回模拟实例ok:

  def exerciseTheStaticMock(){
given:
def globalMock = GroovyMock(ClassWithStatic,global:true)
def instanceMock = Mock(ClassWithStatic)

当:
println(ClassWithStatic.staticMethodThatReturnsAnInstance()。instanceMethod(testParam))

then:
interaction {
1 * ClassWithStatic.staticMethodThatReturnsAnInstance()>> instanceMock
1 * instanceMock.instanceMethod(_)>> returnThing
}
}

但是如果我从ClassUnderTest运行methodUnderTest:

  def failingAttemptToGetPastStatic(){
given:
def globalMock = GroovyMock(ClassWithStatic,global:true)
def instanceMock = Mock(ClassWithStatic)
ClassUnderTest myClassUnderTest = new ClassUnderTest()

when:
myClassUnderTest.methodUnderTest(testParam)

那么:
interaction {
1 * ClassWithStatic.staticMethodThatReturnsAnInstance()>> instanceMock
1 * instanceMock.instanceMethod(_)>> returnThing
}
}

它抛出了一个ClassWithStatic的实例,在其实例方法中失败。

解决方案

Spock只能模拟在Groovy中实现的静态方法。为了模拟用Java实现的静态方法,你需要使用一个工具,比如 GroovyMock PowerMock

First-timer here, apologies if I've missed anything. I'm hoping to get around a call to a static method using Spock. Feedback would be great

With groovy mocks, I thought I'd be able to get past the static call but haven't found it. For background, I'm in the process of retrofitting tests in legacy java. Refactoring is prohibited. I'm using spock-0.7 with groovy-1.8.

The call to the static method is chained with an instance call in this form:

public class ClassUnderTest{

public void methodUnderTest(Parameter param){
  //everything else commented out
Thing someThing = ClassWithStatic.staticMethodThatReturnsAnInstance().instanceMethod(param);
   }

}

staticMethod returns an instance of ClassWithStatic instanceMethod returns the Thing needed in the rest of the method

If I directly exercise the global mock, it returns the mocked instance ok:

def exerciseTheStaticMock(){
    given:
    def globalMock = GroovyMock(ClassWithStatic,global: true)
    def instanceMock = Mock(ClassWithStatic)

    when:
    println(ClassWithStatic.staticMethodThatReturnsAnInstance().instanceMethod(testParam))

    then:
    interaction{
        1 * ClassWithStatic.staticMethodThatReturnsAnInstance() >> instanceMock
        1 * instanceMock.instanceMethod(_) >> returnThing
    }
}

But if I run the methodUnderTest from the ClassUnderTest:

def failingAttemptToGetPastStatic(){
    given:
    def globalMock = GroovyMock(ClassWithStatic,global: true)
    def instanceMock = Mock(ClassWithStatic)
    ClassUnderTest myClassUnderTest = new ClassUnderTest()

    when:
    myClassUnderTest.methodUnderTest(testParam)

    then:
    interaction{
        1 * ClassWithStatic.staticMethodThatReturnsAnInstance() >> instanceMock
        1 * instanceMock.instanceMethod(_) >> returnThing
    }
}

It throws down a real instance of ClassWithStatic that goes on to fail in its instanceMethod.

解决方案

Spock can only mock static methods implemented in Groovy. For mocking static methods implemented in Java, you'll need to use a tool like GroovyMock , PowerMock or JMockit.

PS: Given that these tools pull of some deep tricks in order to achieve their goals, I'd be interested to hear if and how well they work together with tests implemented in Groovy/Spock (rather than Java/JUnit).

这篇关于使用GroovyMock或Spock中的类似方法来模拟静态方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆