Mock static method with GroovyMock or similar in Spock

前端 未结 3 1645
误落风尘
误落风尘 2020-12-10 12:07

First-timer here, apologies if I\'ve missed anything. I\'m hoping to get around a call to a static method using Spock. Feedback would be great

With groovy mocks, I

相关标签:
3条回答
  • 2020-12-10 12:55

    Spock can only mock static methods implemented in Groovy. For mocking static methods implemented in Java, you'll need to use a tool like GroovyMock , PowerMock or JMockit.

    PS: Given that these tools pull of some deep tricks in order to achieve their goals, I'd be interested to hear if and how well they work together with tests implemented in Groovy/Spock (rather than Java/JUnit).

    0 讨论(0)
  • 2020-12-10 12:55

    Here is how I solved my similar issue (mocking a static method call which is being called from another static class) with Spock (v1.0) and PowerMock (v1.6.4)

    import org.junit.Rule
    import org.powermock.core.classloader.annotations.PowerMockIgnore
    import org.powermock.core.classloader.annotations.PrepareForTest
    import org.powermock.modules.junit4.rule.PowerMockRule
    import spock.lang.Specification
    import static org.powermock.api.mockito.PowerMockito.mockStatic
    import static org.powermock.api.mockito.PowerMockito.when
    
    @PrepareForTest([YourStaticClass.class])
    @PowerMockIgnore(["javax.xml.*", "ch.qos.logback.*", "org.slf4j.*"])
    class YourSpockSpec extends Specification {
    
    @Rule
    Powermocked powermocked = new Powermocked();
    
    def "something something something something"() {
        mockStatic(YourStaticClass.class)
    
        when: 'something something'
        def mocked = Mock(YourClass)
        mocked.someMethod(_) >> "return me"
    
        when(YourStaticClass.someStaticMethod(xyz)).thenReturn(mocked)
    
        then: 'expect something'
        YourStaticClass.someStaticMethod(xyz).someMethod(abc) == "return me"
    
       }
    }
    

    The @PowerMockIgnore annotation is optional, only use it if there is some conflicts with existing libraries

    0 讨论(0)
  • 2020-12-10 12:57

    The way I've gotten around static methods in Groovy/Spock is by creating proxy classes that are substituted out in the actual code. These proxy classes simply return the static method that you need. You would just pass in the proxy classes to the constructor of the class you're testing.

    Thus, when you write your tests, you'd reach out to the proxy class (that will then return the static method) and you should be able to test that way.

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