6
votes

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?

2

2 Answers

6
votes

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?)

1
votes

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

when:
Whoah whoah = something.doSomething() >> expectedResult