ドメインクラスをJSON応答にレンダリングするGrailsコントローラーの単体テストを作成しています。
class MyController {
def find = {
def domainInst = MyDomainClass.get(params.id)
render ([data: domainInst] as JSON)
}
}
単体テストはControllerUnitTestCaseを拡張し、ドメインオブジェクトのモックを提供します。
class MyControllerTests extends ControllerUnitTestCase {
@Before
void setUp() {
super.setUp()
mockDomain(MyDomainClass, [new MyDomainClass(id: 7)])
}
@Test
void testFind() {
def inst = MyDomainClass.get(7)
controller.params.id = inst.id
controller.find()
assert(controller.response.json.data.id == inst.id)
}
厄介なスタックトレースを吐き出すJSONレンダリングを除いて、これはすべてうまく機能しているようです。
| Failure: testFind(MyControllerTests)
| org.apache.commons.lang.UnhandledException:
org.codehaus.groovy.grails.web.converters.exceptions.ConverterException: Error converting Bean with class MyDomainClass
Caused by: org.codehaus.groovy.grails.web.converters.exceptions.ConverterException: Error converting Bean with class MyDomainClass
at grails.converters.JSON.value(JSON.java:199)
at grails.converters.JSON.convertAnother(JSON.java:162)
at grails.converters.JSON.value(JSON.java:199)
at grails.converters.JSON.render(JSON.java:134)
... 5 more
Caused by: java.lang.reflect.InvocationTargetException
... 9 more
Caused by: groovy.lang.MissingMethodException: No signature of method: MyDomainClass.isAttached() is applicable for argument types: () values: []
Possible solutions: isAttached(), attach()
... 9 more
ドメインクラスではなくマップへの戻りを変更すると、次のように機能します。
render ([data: [id: domainInst.id]] as JSON)
JSONマーシャラーがドメインクラスで死ぬ原因は何ですか?通常の環境では機能しますが、模擬テスト環境では機能しません。このテストを機能させる方法はありますか?