Skip to end of metadata
Go to start of metadata

Suppose we are trying to test the following application:

We might be tempted to replace logger and factory with Groovy's built-in mocks, but it turns out that Maps or Expandos are often sufficiently powerful enough in Groovy that we don't need full blown dynamic mocks for this example.

Instead of a mock for logger, we can use an Expando as follows:

Here the expected behaviour for our production code is captured within a Closure. (When using TDD, this closure would force the production code we saw in our original code to be created.)

Instead of a mock for factory, we can use a simple map as follows:

Here, businessObj is the object we want the factory to return, though in general this could be a Closure similar to what we did for the Expando above.

Putting this altogether yields (after some refactoring) the following complete test:

See also: Developer Testing using Closures instead of Mocks

  • No labels

1 Comment

  1. (question) The consequence is that you can't use types for the declaration of the mocked fields in MyApp, isn't it?

    (info) Correct. The returned type will be Expando or Map which both work fine if you are using duck typing (defined with def) but not if you want stronger typing. For that see Developer Testing using Closures instead of Mocks. This would mean you change this line:

    to:

    where factory is some interface you have defined:

    If you scenario is more complex than this, consider using proper Groovy mocks.