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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 } } |