Over a million developers have joined DZone.
Gold Partner

Clojure: Expectations Ignore A Variable Number Of Args In An Interaction Test

· Java Zone

Over the past year I've written the same test a few times. 

(expect (interaction (my-fn anything) :never)
(a-fn-that-shouldnt-call-my-fn))

This test accomplishes what I'm looking for when I write it - verification that my-fn isn't called. However, it doesn't prevent me from future regressions where my-fn is called with 0, 2, or 2+ arguments. After being bitten by this issue a few times I decided to add an argument matching function that will accept any value for the argument at it's index, and any value for all of the arguments at a greater index. This argument matching function is anything&

The following example is similar to what's above, except any call to my-fn will result in a failure

(expect (interaction (my-fn anything&) :never)
(a-fn-that-shouldnt-call-my-fn))

My original intent was to protect against the scenario I described above*; however, what I ended up with is actually flexible enough to allow me to test other situations as well. For example, I've often found myself testing that a log message was written at a certain level, but not being interested in testing the actual message. The logging I'm working with allows a variable number of arguments, so anything& is perfect for verifying that no matter what args are passed in, the tests passes as long as the level is set correctly.

(expect (interaction (log :warn anything&))
(log :warn "order" 1 "at" (time/now)))

The anything& matching function gives me an extra bit of flexibility that can come in handy at times.

*which is similar to verifyZeroInteractions in mockito

Topics:

Published at DZone with permission of Jay Fields , DZone MVB .

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}