Using PowerMock with Spock

前端 未结 3 1370
有刺的猬
有刺的猬 2021-02-04 13:00

I have a class with a few static methods.I need to Mock these static methods. I know PowerMock does this,but I was not able to find any tutorials/materials that shed some light

相关标签:
3条回答
  • 2021-02-04 13:33

    Since Powermock Version 1.6.0, powermock allows the delegation of the test runner.

    This allows the wrapping of the Spock test runner (Sputnik) within the PowerMock test runner framework. Sputnik will then start the test case specifications, and still allow the use of the PowerMock framework.

    With JUnit4 and Powermock, I use the following template for accessing static classes.

    The test class:

    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()
        ...
    

    The dependencies

      <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>
    
    0 讨论(0)
  • 2021-02-04 13:40

    I was stuck here for a while too. After searching for hours, I saw this github repo: https://github.com/kriegaex/Spock_PowerMock.

    I tried adding a PowerMockRule which essentially enabled me to use PowerMock together with Spock. I had to add these dependencies. Version is at 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>
    

    My class looks like this:

    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!"
        }
    }
    

    Here is another resource: https://github.com/jayway/powermock/wiki/powermockrule

    0 讨论(0)
  • 2021-02-04 13:46

    There is no special integration; your best bet is to try and use PowerMock "as-is". From what I remember, PowerMock used to have problems with Groovy, and I don't know if this has been solved. And if I'm not mistaken, PowerMock rewrites the byte code of test classes, so the next question is if it works with Spock. Let us know what you find.

    0 讨论(0)
提交回复
热议问题