2009/9/28 C. Florian Ebeling <[email protected]>
>
> > In Java I'd just have an interface
> > with two implementations, and bootstrap the tests with a different
> > implementation, in clojure I guess I'd do something like:
> > (in-ns `some.thing)
> > (defn foo [] nil)
> > or something?
>
> That would consitute a root binding because of the 'defn, but you need
> a dynamic rebinding. This is what you can use:
>
> (binding [existing-function (fn [a b] ...)]
> ;; your tests here
> )
>
But as soon as your application becomes smart enough to do things in
parallel (e.g. create and send an e-mail in a separate thread), just using
dynamic binding in tests may not be enough, still the binding will not be
seen by default by other threads.
>
> For mocking java interfaces and classes I'm quite happy with Mockito
> [1], even though it's usage doesn't look always intuitive in clojure.
> This is an example for mock-testing a hadoop map function.
>
> (defn mock [#^Class class]
> (. Mockito mock class))
>
> (defn mock-output []
> (mock OutputCollector))
>
> (defn mock-mapper []
> (mock namespace.surveyed-users-mapper0))
>
> (defn mock-reducer []
> (mock namespace.surveyed-users-reducer0))
>
> (defn mock-reporter []
> (mock Reporter))
>
> (defn mock-conf []
> (mock JobConf))
>
> (defn mock-filesystem []
> (mock FileSystem))
>
> (defn verify
> ([mock]
> (. Mockito verify mock))
> ([mock mode]
> (. Mockito verify mock mode)))
>
> (defn stub [mock]
> (. Mockito when mock))
>
> (deftest mapper0-map-click-test
> (let [output (mock-output)
> mapper (mock-mapper)
> key (to-key nil)
> value (Text. (tab "9900" "550" "990" "4040" "1" "3"))
> reporter (mock-reporter)]
> (doto (stub (.getState mapper))
> (.thenReturn (ref {:network "9900"
> :input-file-name
> "/path/clicks/week/33/result/part-00000"
> :pagerules-table {"4040" ["1" "2" "3"]}})))
> (mapper0-map mapper key value output reporter)
> (verify output)
> (.collect output (Text. "550") (Text. "0\t1,2,3"))))
>
> You need to import all the unqualified classes used here, of course.
>
> Florian
>
> [1] http://mockito.org/
>
> --
> Florian Ebeling
> [email protected]
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---