11

我有一个带有一些静态方法的类。我需要模拟这些静态方法。我知道 PowerMock 可以做到这一点,但我无法找到任何能够阐明“Spock+PowerMock”集成的教程/材料。我更喜欢 Spock 而不是 Junit,因此这是个难题。有没有办法让这两个框架发挥作用?非常感谢任何帮助。示例代码,更是如此。

更新:该方法的现状

Spock行为怪异

4

3 回答 3

15

我也被困在这里了一段时间。搜索了几个小时后,我看到了这个 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

于 2014-07-15T02:36:55.610 回答
1

没有特殊的集成;您最好的选择是尝试“按原样”使用 PowerMock。据我记得,PowerMock 以前用Groovy 有问题,不知道有没有解决。如果我没记错的话,PowerMock 重写了测试类的字节码,所以下一个问题是它是否适用于 Spock。让我们知道你发现了什么。

于 2013-10-21T12:25:27.737 回答
1

从 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>
于 2019-09-09T04:57:14.453 回答