如何在Groovy SPOCK框架中测试静态java方法? [英] How to test static java methods in groovy SPOCK framework?
问题描述
这里是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屋!