如何在Groovy SPOCK框架中测试静态java方法? [英] How to test static java methods in groovy SPOCK framework?

查看:277
本文介绍了如何在Groovy SPOCK框架中测试静态java方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



这里是java类

  public class DataController {

private DataInterface userService;

public void setUserService(DataInterface userService){
this.userService = userService;
}
public static int addNumber(){
int a = 10;
int b = 20;
返回a + b;


以下是groovy中的SPOCK测试



$ $ p $ @PrepareForTest([DataController.class])
class BasicMockStaticTest extends Specification {

@Rule PowerMockRule powerMockRule = new PowerMockRule();

当mocking static(){
setup:
PowerMockito.mockStatic(DataController.class)

时:
Mockito 。当(DataController.addNumber())thenReturn(30)。

then:
DataController.addNumber()== 30
}
}

和POM文件片段

 <依赖关系> 
<! - Spock Framework基本依赖关系: - >
< dependency>
< groupId> org.codehaus.groovy< / groupId>
< artifactId> groovy-all< / artifactId>
< version> 2.3.1< / version>
< scope> test< / scope>
< /依赖关系>
< dependency>
< groupId> org.spockframework< / groupId>
< artifactId> spock-core< / artifactId>
<! - 版本必须与Groovy兼容 - >
< version> 1.0-groovy-2.3< / version>
< scope> test< / scope>
< /依赖关系>
<! - 使用Hamcrest匹配器: - >
< dependency>
< groupId> org.hamcrest< / groupId>
< artifactId> hamcrest-core< / artifactId>
< version> 1.3< / version>
< scope> test< / scope>
< /依赖关系>
<! - 模拟课程: - >
< dependency>
< groupId> cglib< / groupId>
< artifactId> cglib-nodep< / artifactId>
< version> 3.1< / version>
< scope> test< / scope>
< /依赖关系>
<! - 与cglib一起用来模拟没有默认构造函数的类: - >
< dependency>
< groupId> org.objenesis< / groupId>
< artifactId> objenesis< / artifactId>
< version> 2.1< / version>
< scope> test< / scope>
< /依赖关系>
< dependency>
< groupId> org.codehaus.gmavenplus< / groupId>
< artifactId> gmavenplus-plugin< / artifactId>
< version> 1.5< / version>
< /依赖关系>
<! - Power mock dependencies - >
< dependency>
< groupId> org.powermock< / groupId>
< artifactId> powermock-module-junit4< / artifactId>
< version> 1.5.4< / version>
< scope> test< / scope>
< /依赖关系>

< dependency>
< groupId> org.powermock< / groupId>
< artifactId> powermock-module-junit4-rule< / artifactId>
< version> 1.5.4< / version>
< scope> test< / scope>
< /依赖关系>

< dependency>
< groupId> org.powermock< / groupId>
< artifactId> powermock-classloading-xstream< / artifactId>
< version> 1.5.4< / version>
< scope> test< / scope>
< /依赖关系>
< /依赖关系>

< build>
< testSourceDirectory> E:\Workspace\Mars\rg\Spock\src\test\groovy< / testSourceDirectory>
< pluginManagement>
< plugins>
<! - GMavenPlus插件 - >
< plugin>
< groupId> org.codehaus.gmavenplus< / groupId>
< artifactId> gmavenplus-plugin< / artifactId>
< version> 1.5< / version>
<执行次数>
<执行>
<目标>
< goal> addSources< / goal>
< goal> addTestSources< / goal>
< goal> generateStubs< / goal>
< goal>编译< / goal>
< goal> testGenerateStubs< / goal>
< goal> testCompile< / goal>
< goal> removeStubs< / goal>
< goal> removeTestStubs< / goal>
< /目标>
< /执行>
< /执行次数>
< / plugin>
<! - 只有在spec类的名称不符合默认的Surefire模式(`* Test`等)时才需要 - >>
< plugin>
< artifactId> maven-surefire-plugin< / artifactId>
< version> 2.6< / version>
<配置>
< useFile> false< / useFile>
<包括>
< include> ** / * Test *。*< / include>
< include> ** / * Spec *。*< / include>

< / includes>

我在groovy文件夹中有4个测试用例,3个正在传递,但是这个静态方法测试正在给出错误如下:

 当模拟静态(BasicMockStaticTest)时间已过:0.104秒<<<错误! 
java.lang.IllegalStateException:扩展API内部错误:org.powermock.api.extension.proxyframework.ProxyFrameworkImpl无法位于类路径中。
at org.powermock.modules.junit4.rule.PowerMockClassloaderExecutor.registerProxyframework(PowerMockClassloaderExecutor.java:60)
at org.powermock.modules.junit4.rule.PowerMockClassloaderExecutor.forClass(PowerMoc kClassloaderExecutor.java:50 )
at org.powermock.modules.junit4.rule.PowerMockRule.apply(PowerMockRule.java:31)
at org.spockframework.runtime.extension.builtin.MethodRuleInterceptor.intercept(MethodRuleInterceptor.java:37 )
at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:87)
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:59)
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:120)
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:103)
在org.apache.maven.surefire.Surefire.run(Surefire.java:169)
在org.apache.maven.surefire.booter.SurefireBoote r.runSuitesInProcess(SurefireBooter.java:350)
at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)

我正在运行mvn测试来测试这些junit,我尝试将cglib-nodep的版本从3.1更改为2.2.2,但它无效。



我检查了包含jar文件的java构建路径

  powermock-module- junit4-1.5.4 
powermock-module-junit4-common-1.5.4
powermock-reflect-1.5.4
powermock-module-junit4-rule-1.5.4
powermock-classloading-base-1.5.4
powermock-classloading-xstream-1.5.4
powermock-api-support-1.5.4
powermock-core-1.5.4
groovy-all-2.3.1.jar
spock-core-1.0-grovy-2.3.jar

我还添加了powermock-mockito-release-full-1.5.4,但是在添加测试用例之后,没有任何一个测试用例运行并且构建成功,但那不是我的意图。



我怀疑可能是一些依赖关系丢失或部分现有的存在冲突,但无法前进。



任何人都可以告诉什么是错误的,即使它失败了,我也可以继续处理测试用例,我会纠正它,但我需要先删除错误。

在一个侧面说明我也试过groovyMock,但它给了静态方法的空指针异常,然后我搜索并发现静态方法没有与groovyMock工作。



我已经尝试与流行的博客和教程的顶部谷歌链接结果,但似乎没有工作。

解决方案

我在Spock中使用GroovyMock来测试静态方法(Java中的静态方法,BTW): b
$ b

  GroovyMock(Foo,global:true)
Foo.bar(_)>> my-fake-result

我也在Spock的$ test中添加了这个注解$ b到我的模拟不会干扰其他测试:

  @ConfineMetaClassChanges([Foo])


I am trying to test static java method in SPOCK groovy framework using Maven.

Here is the java class

  public class DataController {

 private DataInterface userService;

    public void setUserService(DataInterface userService) {
        this.userService = userService;
    }
   public static int addNumber(){
        int a = 10;
        int b = 20;
        return a+b;
    }   
 }

Here is the SPOCK test in groovy

@PrepareForTest([DataController.class])
class BasicMockStaticTest extends Specification {

@Rule PowerMockRule powerMockRule = new PowerMockRule();

    def "When mocking static"() {
        setup :
            PowerMockito.mockStatic(DataController.class)

        when :
            Mockito.when(DataController.addNumber()).thenReturn(30);

        then :
            DataController.addNumber() == 30
    }
 }

and the POM File snippet

   <dependencies>
    <!-- Spock Framework basic dependencies: -->
    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.3.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.spockframework</groupId>
        <artifactId>spock-core</artifactId>
        <!-- The version have to be compatible with Groovy -->
        <version>1.0-groovy-2.3</version>
        <scope>test</scope>
    </dependency>
    <!-- To use Hamcrest matchers: -->
    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-core</artifactId>
        <version>1.3</version>
        <scope>test</scope>
    </dependency>
    <!-- To mock classes: -->
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib-nodep</artifactId>
        <version>3.1</version>
        <scope>test</scope>
    </dependency>
    <!-- Use with cglib to mock classes without default constructor: -->
    <dependency>
        <groupId>org.objenesis</groupId>
        <artifactId>objenesis</artifactId>
        <version>2.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
  <groupId>org.codehaus.gmavenplus</groupId>
  <artifactId>gmavenplus-plugin</artifactId>
  <version>1.5</version>
 </dependency>
 <!-- Power mock dependencies -->
 <dependency>
 <groupId>org.powermock</groupId>
 <artifactId>powermock-module-junit4</artifactId>
 <version>1.5.4</version>
 <scope>test</scope>
 </dependency>

 <dependency>
 <groupId>org.powermock</groupId>
 <artifactId>powermock-module-junit4-rule</artifactId>
 <version>1.5.4</version>
 <scope>test</scope>
 </dependency>

<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-classloading-xstream</artifactId>
<version>1.5.4</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
    <testSourceDirectory>E:\Workspace\Mars\rg\Spock\src\test\groovy</testSourceDirectory>
<pluginManagement>
    <plugins>
        <!-- GMavenPlus plugin -->
        <plugin>
            <groupId>org.codehaus.gmavenplus</groupId>
            <artifactId>gmavenplus-plugin</artifactId>
            <version>1.5</version>
            <executions>
                <execution>
                    <goals>
                     <goal>addSources</goal>
          <goal>addTestSources</goal>
          <goal>generateStubs</goal>
          <goal>compile</goal>
          <goal>testGenerateStubs</goal>
          <goal>testCompile</goal>
          <goal>removeStubs</goal>
          <goal>removeTestStubs</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
         <!-- Only required if names of spec classes don't match default    Surefire patterns (`*Test` etc.) -->
         <plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.6</version>
    <configuration>
      <useFile>false</useFile>
      <includes>
        <include>**/*Test*.*</include>
        <include>**/*Spec*.*</include>

      </includes>

I have 4 test cases in the groovy folder , 3 are passing , but this static method test is giving error as

 When mocking static(BasicMockStaticTest)  Time elapsed: 0.104 sec  <<< ERROR!
   java.lang.IllegalStateException: Extension API internal error:   org.powermock.api.extension.proxyframework.ProxyFrameworkImpl could not be  located in classpath.
    at   org.powermock.modules.junit4.rule.PowerMockClassloaderExecutor.registerProxyframework(PowerMockClassloaderExecutor.java:60)
    at  org.powermock.modules.junit4.rule.PowerMockClassloaderExecutor.forClass(PowerMoc kClassloaderExecutor.java:50)
    at org.powermock.modules.junit4.rule.PowerMockRule.apply(PowerMockRule.java:31)
at org.spockframework.runtime.extension.builtin.MethodRuleInterceptor.intercept(MethodRuleInterceptor.java:37)
at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:87)
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:59)
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:120)
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:103)
at org.apache.maven.surefire.Surefire.run(Surefire.java:169)
at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350)
at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)

I am running mvn test to test these junits , I tried changing the version of cglib-nodep from 3.1 to 2.2.2 but it did not work.

I checked in the java build path following jar files are included

powermock-module-junit4-1.5.4
powermock-module-junit4-common-1.5.4
powermock-reflect-1.5.4
powermock-module-junit4-rule-1.5.4
powermock-classloading-base-1.5.4
powermock-classloading-xstream-1.5.4
powermock-api-support-1.5.4
powermock-core-1.5.4
groovy-all-2.3.1.jar
spock-core-1.0-grovy-2.3.jar

I also added powermock-mockito-release-full-1.5.4 but after adding that none of the test cases ran and build was success but that was not my intent.

I am suspecting may be some of the dependencies are missing or some of the existing are conflicting but not able to move forward.

Can any one tell what is wrong , I can move forward with the test case even if it fails , I will correct it but I need to remove the error first .

On a side note I did try groovyMock also but it gave nullpointer exception for static method , then I searched and found static method did not work with groovyMock.

I have tried top google link results with popular blogs and tutorial but none seems to work.

解决方案

I'm using GroovyMock in Spock to test static methods (static methods in Java, BTW):

GroovyMock(Foo, global: true)
Foo.bar(_) >> "my-fake-result"

I also added this annotation to my test method in Spock, to my mock not interfere in other tests:

@ConfineMetaClassChanges([Foo])  

这篇关于如何在Groovy SPOCK框架中测试静态java方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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