Spock rightShift (mocking) operator apparently not working
Asked Answered
R

2

7

Here is my Spock unit test:

def "when favorite color is red then doSomething produces empty list of things"() {
    given:
    FizzBuzz fizzBuzz = Mock(FizzBuzz)
    fizzBuzz.name >> 'Dark Helmet'
    fizzBuzz.attributes >> [:]
    fizzBuzz.attributes["favcolor"] >> 'red'
    fizzBuzz.attributes["age"] >> '36'

    Something something = new Something(fizzBuzz)

    when:
    Whoah whoah = something.doSomething()

    then:
    !whoah.things
}

And here is the FizzBuzz mock:

public interface FizzBuzz extends Serializable {
    Map<String, Object> getAttributes();
}

When I run this I get:

java.lang.NullPointerException: Cannot invoke method rightShift() on null object

at com.commercehub.houston.SomethingSpec.when favorite color is red then doSomething produces empty list of things fail(SomethingSpec.groovy:18)

Process finished with exit code 255

The 'null object' its referring to on Line 18 is either fizzBuzz or its attributes map. Why?

Reservist answered 12/1, 2016 at 12:51 Comment(0)
M
6

You're attempting to use multiple levels of indirection, and the >> is getting applied to the result of .attributes["favcolor"], which is null (since .attributes is an empty map). Instead, just initialize the map:

fizzBuzz.attributes >> [favcolor: 'red', age: 36]

(Also, did you really mean age to be a string?)

Marmara answered 12/1, 2016 at 13:8 Comment(0)
C
1

In my case, I realized I was accidentally declaring the result of the when block.

when:
Whoah whoah = something.doSomething() >> expectedResult
Cony answered 4/7, 2020 at 14:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.