We can use the metaClass
property of classes to define behavior we want to use in our tests. But if we do, the change is not only for the duration of a test method, but for the entire test run. This is because we make a change at class level and other tests that use the class will get the new added behavior. To limit our change to a test method we first use the registerMetaClass()
method. Grails will remove our added behavior automatically after the test method is finished.
Let's see this with an example. We have a domain class User
which uses the Searchable plugin. This plugin will add a search()
and we want to use in our test case.
class User { static searchable = true String username } class UserTests extends GrailsUnitTestCase { void testSearch() { registerMetaClass User User.metaClass.static.search = { searchText -> [results: [new User(username:'mrhaki')], total: 1, offset: 0, scores: [1]] } assertEquals 'mrhaki', User.search('mrhaki').results[0].username } }