我有一个带有一些静态方法的类。我需要模拟这些静态方法。我知道 PowerMock 可以做到这一点,但我无法找到任何能够阐明“Spock+PowerMock”集成的教程/材料。我更喜欢 Spock 而不是 Junit,因此这是个难题。有没有办法让这两个框架发挥作用?非常感谢任何帮助。示例代码,更是如此。
更新:该方法的现状
我也被困在这里了一段时间。搜索了几个小时后,我看到了这个 github 仓库:https ://github.com/kriegaex/Spock_PowerMock 。
我尝试添加一个 PowerMockRule,它基本上使我能够将 PowerMock 与 Spock 一起使用。我不得不添加这些依赖项。版本为 1.5.4
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4-rule</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-classloading-xstream</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
我的课看起来像这样:
import org.junit.Rule
import org.mockito.Mockito
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.rule.PowerMockRule
import spock.lang.Specification
@PrepareForTest([SomeStaticClass.class])
public class FlightFormSpec extends Specification {
@Rule PowerMockRule powerMockRule = new PowerMockRule();
def "When mocking static"() {
setup :
PowerMockito.mockStatic(SomeStaticClass.class)
when :
Mockito.when(SomeStaticClass.someStaticMethod()).thenReturn("Philippines!");
then :
SomeStaticClass.someStaticMethod() == "Philippines!"
}
}
这是另一个资源:https ://github.com/jayway/powermock/wiki/powermockrule
没有特殊的集成;您最好的选择是尝试“按原样”使用 PowerMock。据我记得,PowerMock 以前用Groovy 有问题,不知道有没有解决。如果我没记错的话,PowerMock 重写了测试类的字节码,所以下一个问题是它是否适用于 Spock。让我们知道你发现了什么。
从 Powermock 版本 1.6.0 开始,powermock 允许测试运行程序的委派。
这允许在 PowerMock 测试运行程序框架内包装 Spock 测试运行程序 (Sputnik)。然后 Sputnik 将启动测试用例规范,并且仍然允许使用 PowerMock 框架。
使用 JUnit4 和 Powermock,我使用以下模板来访问静态类。
测试类:
package mypackage;
import org.junit.runner.RunWith
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
import org.powermock.modules.junit4.PowerMockRunnerDelegate
import org.spockframework.runtime.Sputnik
import spock.lang.Specification
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
@PrepareForTest([MyStaticMethodClass.class])
class MyTestForClassTest extends Specification {
def myStaticMethodClass
def setup() {
PowerMockito.mockStatic(MyStaticMethodClass.class)
myStaticMethodClass= Mock(MyStaticMethodClass)
PowerMockito.when(MyStaticMethodClass.getInstance()).thenReturn(myStaticMethodClass)
}
@Unroll
def "#TestCase policy RF210 triggered"() {
given: "a product list for the policy"
myStaticMethodClass.someInstanceMethod() >> "my return value"
classUnderTest = new ClassUnderTest()
...
依赖项
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.7.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.7.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>1.3-groovy-2.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>3.3.0</version>
<scope>test</scope>
</dependency>