I’m a big fan of the famous Grails Testing Plugin, which is used to mock domain classes, controllers and many more things usually needed in my unit tests for Grails. Here’s a quick example from its documentation:
class BookTests extends GrailsUnitTestCase {
void testConstraints() {
def existingBook = new Book(title: "Misery", author: "Stephen King")
mockForConstraintsTests(Book, [ existingBook ])
// Validation should fail if both properties are null.
def book = new Book()
assertFalse book.validate()
assertEquals "nullable", book.errors["title"]
assertEquals "nullable", book.errors["author"]
// So let's demonstrate the unique and minSize constraints.
book = new Book(title: "Misery", author: "JK")
assertFalse book.validate()
assertEquals "unique", book.errors["title"]
assertEquals "minSize", book.errors["author"]
// Validation should pass!
book = new Book(title: "The Shining", author: "Stephen King")
assertTrue book.validate()
}
}
Recently in a Grails 1.0.5 project I had to unit test a service method. Because of several “log” statements, I had the dreaded
groovy.lang.MissingPropertyException:
No such property: log for class: SubscriptionService
Fortunately, the testing framework has the excellent mock Logging() method in place for that, which provides a mock implementation of the “log” property for the given class, in my case SubscriptionService. Here’s how I created my setUp() method:
void setUp() {
mockLogging(SubscriptionService.class, true)
}
This resulted in
java.lang.NullPointerException:
Cannot invoke method containsKey() on null object
It was a NPE on the following part inside GrailsUnitTestCase.groovy:
protected void registerMetaClass(Class clazz) {
// If the class has already been registered, then there's
// nothing to do.
if (savedMetaClasses.containsKey(clazz)) return
...
After some digging around, it almost seemed to trivial to fix thix. Just add called the super’s setUp() first.
void setUp() {
super.setUp()
mockLogging(SubscriptionService.class, true)
}
Happy mocking!