我有两个Controller单元测试,每个都设置一个HttpClient元类在setUp()中执行,如下所示:
HttpClient.metaClass.execute = { HttpUriRequest request ->
<return expected data for my tests>
}
然后我尝试使用以下代码拆除tearDown()中的metaClass:
protected void tearDown() {
super.tearDown()
GroovySystem.metaClassRegistry.removeMetaClass(HttpClient.class)
}
但是,只有一个单元测试通过,因为来自HttpClient的返回不正确/意外。如果我在两个测试的metaClass.execute中添加两个测试所需的逻辑,我就没有测试失败。然而,这很麻烦且不切实际,特别是在敏捷开发环境中。
尝试拆除此HttpClient元类注册时,我做错了什么?我该如何进一步解决这个问题?
我目前在CentOS 5安装上使用grails 1.3.7。
编辑:我应该澄清一下,我的问题是metaClass覆盖导致测试类之间的问题,而不是测试用例。我们一直在设置metaClass覆盖,以便它返回给定类中所有测试用例的正确数据。因此,测试类A具有针对其测试用例的metaClass数据,而测试类B具有针对其测试用例的元类数据。问题是,由于测试类A首先被测试,测试类B最终使用测试类A中的metaClass定义,因此失败。
答案 0 :(得分:0)
您不需要实现tearDown
方法。假设您正在扩展ControllerUnitTestCase
或GrailsUnitTestCase
如果在metaClass执行方法之前调用registerMetaClass HttpClient
,它将替换测试类之间的HttpClient的metaClass。我从来没有使用removeMetaClass
方法,所以我不知道为什么那不起作用所以我无法回答为什么这不起作用的问题,但这应该让你超越你的问题。
...
registerMetaClass HttpClient
HttpClient.metaClass.execute = { HttpUriRequest request ->
<return expected data for my tests>
}
答案 1 :(得分:0)
我最终使用的解决方案有点像黑客,但它更容易维护。我刚刚在src / groovy中创建了一个创建HttpClient.metaClass的类,然后让每个需要它的测试类在新类上运行静态方法。这样,元分类的所有必要代码都在一个地方。