GroovyMock用于使用静态方法调用测试Java类时不工作

GroovyMock用于使用静态方法调用测试Java类时不工作,java,unit-testing,groovy,mocking,spock,Java,Unit Testing,Groovy,Mocking,Spock,当静态类在其他Java类中使用时,Groovy测试不会为该类创建模拟。下面是证明这一点的代码片段 正在测试的Java类: public class JavaClass { public void method() { ClassWithStaticMethod.doSomething(); } } 具有静态方法的Java类: public class ClassWithStaticMethod { public static void doSomethi

当静态类在其他Java类中使用时,Groovy测试不会为该类创建模拟。下面是证明这一点的代码片段

正在测试的Java类:

public class JavaClass {
    public void method() { 
      ClassWithStaticMethod.doSomething();
    }
}
具有静态方法的Java类:

public class ClassWithStaticMethod { 
    public static void doSomething() {
        System.out.println("Static method called");
    } 
}
失败的Groovy测试:

class JavaClassTest extends Specification {
  def 'test'() {
    given:
    GroovyMock(ClassWithStaticMethod, global: true)
    JavaClass javaClass = new JavaClass()

    when:
    javaClass.method()

    then:
    1 * ClassWithStaticMethod.doSomething() // <--- FAILS
  }
}
类JavaClassTest扩展了规范{
def“测试”(){
鉴于:
GroovyMock(ClassWithStaticMethod,全局:true)
JavaClass JavaClass=新的JavaClass()
什么时候:
javaClass.method()
然后:
1*ClassWithStaticMethod.doSomething()//如果java代码是用groovyc编译的
如果java代码与javac兼容
1.准备测试代码(此示例为MySpock.groovy)

3.执行测试

groovy -cp .:$HOME/.groovy/grapes/org.jmockit/jmockit/jars/jmockit-1.8.jar:$HOME/.groovy/grapes/org.spockframework/spock-core/jars/spock-core-1.0-groovy-2.4.jar MySpock
我第一次使用JMockit。
所以,我不知道这个用法是否正确。
我不知道如何在Spock和Mock(JMockit)之间访问和添加staic字段
因此,我创建了日志文件来检查“ClassWithStaticMethod#doSomething”是否是从“JavaClass#方法”调用的。

哦,是的。你是对的……我再次检查了。如果这些代码(JavaClass.java和ClassWithStaticMethod.java)是用“groovyc”编译的,那么上面的代码就可以工作。也许它也需要JMockit来模拟静态方法。
    def "foo"() {
      setup:
        // GroovyMock(ClassWithStaticMethod, global: true)
        GroovySpy(ClassWithStaticMethod, global: true)
        JavaClass javaClass = new JavaClass()

      when:
        javaClass.method()

      then:
        // 1 * ClassWithStaticMethod.doSomething()
        1 * ClassWithStaticMethod.doSomething() >> null
    }
// This Grabs are used for compile.
// These libraries must specifiy on class path when the file executs.
@Grapes([
  @Grab(group='org.jmockit', module='jmockit', version='1.8'),
  @Grab(group='org.spockframework', module='spock-core', version='1.0-groovy-2.4')
])

import spock.lang.*
import mockit.*

class MySpock extends Specification {

  def "hoge"() {
    setup:

    // Overwrite ClassWithStaticMethod#doSomething(static method) with JMockit/MockUp
    new MockUp<ClassWithStaticMethod>() {
      @Mock
      public static void doSomething() {
        Logger.append("abc")
      }

    }

    // Target object for this test
    JavaClass javaClass = new JavaClass()

    when: "Execute target method"
    javaClass.method()

    then: "ClassWithStaticMethod#doSomething was mocked and write the value in a file"
    Logger.count() == 1

    cleanup: "Delete log file for this test"
    Logger.delete()
  }
}

// Logging Utility for only this test.
class Logger {
  static logFile = new File("/tmp/MySpock.groovy.log")
  static append = {String msg -> logFile.append("${msg}${System.getProperty("line.separator")}")}
  static count = {logFile.readLines()?.size()?:0}
  static delete = { logFile.delete() }
}
javac ClassWithStaticMethod.java&&javac JavaClass.java&&groovyc MySpock.groovy
groovy -cp .:$HOME/.groovy/grapes/org.jmockit/jmockit/jars/jmockit-1.8.jar:$HOME/.groovy/grapes/org.spockframework/spock-core/jars/spock-core-1.0-groovy-2.4.jar MySpock