Grails 2.0.1でリファクタリングを行っているときにこれに遭遇しましたが、この問題の基本をまっすぐなグルーヴィーな1.8.6テストに引き出しましたが、それでも失敗しました。私のメソッドは以前はパラメーターを受け取らなかったので、1つのパラメーターを受け取るように変更したので、この問題に遭遇しました。実装する本番コードを変更したとき、どのテストも失敗しませんでした。テストで使用したmetaClassingはパラメーターを受け入れないように設定されていましたが、パラメーターを渡したときに本番コードに応答していたため、これは奇妙なことです。したがって、以下の例では、なぜ最初のmetaClassingではなく2番目のmetaClassingが呼び出されているのか疑問に思っています。パラメータを受け入れません。ご覧のとおり、パラメータを渡します。metaClassingの順序を切り替えると、適切に機能しますが、順序は正しくありません。この場合、メソッドのシグネチャが異なるため、問題にはなりません。なぜこれが起こっているのかについての洞察をいただければ幸いです。
import groovy.util.GroovyTestCase
class FirstTest extends GroovyTestCase {
void testStuff() {
def object = new Object()
object.metaClass.someMethodName = {Object obj ->
"ONE"
}
object.metaClass.someMethodName = {
"TWO"
}
def result = object.someMethodName(new Object())
assert "ONE" == result //result is equal to "TWO" in this case
}
}
編集
上記のコードは役立つというよりも混乱を招く可能性があるように思われるので、実際のコードを次に示します。
元の生産コード:
def create() {
render(view: "create", model: [domains: Domain.myCustomListMethod().sort{it.cn}])
}
元のテストコード:
@Test
void createShouldIncludeAListOfAllDomainsInModel() {
def directory = GldapoDirectory.newInstance(
"", [
url: "http://url.com",
userDn: "someUserName",
password: "superSecretPassword"
])
controller.session.userDirectory = directory
Domain.metaClass.'static'.myCustomListMethod = {
[[cn:"1"], [cn:"2"]]
}
controller.create()
assert [[cn:"1"], [cn:"2"]] == controller.modelAndView.model.domains
}
次に、本番コードを更新して合格しましたがsession.userDirectory
、パラメーターを受け取るように設定されていなくても、テストは変更されずに合格しました。
def create() {
render(view: "create", model: [domains: Domain.list(session.userDirectory).sort{it.cn}])
}