2012-03-27 31 views
0

我有兩個控制器單元測試,每一個設置一個HttpClient的元類的設置()像下面執行:爲什麼不正確的HttpClient Grails中推倒單元測試之間

HttpClient.metaClass.execute = { HttpUriRequest request -> 
    <return expected data for my tests> 
} 

然後我試圖撕裂向下()元類的拆卸與下面的代碼:

protected void tearDown() { 
    super.tearDown() 
    GroovySystem.metaClassRegistry.removeMetaClass(HttpClient.class) 
} 

但是隻有我的單元測試一個傳遞,因爲來自HttpClient的回報是不正確的/出乎意料。如果我在兩個測試的metaClass.execute中添加兩個測試所需的邏輯,我不會收到測試失敗。然而,這很麻煩且不切實際,特別是在敏捷開發環境中。

我在做什麼錯在試圖拆除這個HttpClient元類註冊?我如何進一步解決這個問題?

我目前在CentOS 5安裝上使用grails 1.3.7。

編輯:我要澄清,我的問題是,元類倍率測試之間導致問題,沒有測試的情況。我們一直在設置metaClass覆蓋,以便它將返回給定類中所有測試用例的正確數據。因此,測試類A具有用於其測試用例的metaClass數據,而測試類B具有用於其測試用例的metaClass數據。問題是,由於測試類A首先被測試,所以測試類B最終使用來自測試類A的metaClass定義並因此而失敗。

回答

0

我最終使用的解決方案有點破解,但它更容易維護。我只是在src/groovy中創建了一個創建HttpClient.metaClass的類,然後讓每個需要它的測試類在新類上運行靜態方法。這樣,元分類的所有必要代碼都在一個地方。

0

你不應該需要實現一個tearDown方法。假設你正在擴展ControllerUnitTestCaseGrailsUnitTestCase如果你在metaClass之前調用registerMetaClass HttpClient執行方法,它將替換你的測試類之間的metaClass for HttpClient。我從來沒有使用removeMetaClass方法,所以我不知道爲什麼這不起作用,所以我不能回答爲什麼這不起作用的問題,但這應該讓你過去的問題。

... 
registerMetaClass HttpClient 
HttpClient.metaClass.execute = { HttpUriRequest request -> 
    <return expected data for my tests> 
} 
+0

我的兩個測試類擴展了ControllerUnitTestCase。我試着在setUp()方法中直接在測試用例方法本身中添加你建議的代碼。在這兩種情況下,第一個被測試的類的.metaClass覆蓋被用在第二個測試類中。也許我應該澄清,我的問題不在測試用例之間,而是在測試類之間。 – twilbrand 2012-03-27 18:51:55

+0

'registerMetaClass'在類和方法/測試用例之間起作用。我會認爲還有別的東西會導致你的問題。讓我確定我瞭解你的設置。 TestClass1(包含metaClassing和通行證)TestClass2(不包含metaClassing並失敗)? – 2012-03-27 18:58:00

+0

關閉,但TestClass2包含metaClassing並失敗。如果我將printlns添加到TestClass1和TestClass2,我會在TestClass2的輸出中看到來自TestClass1的日誌 – twilbrand 2012-03-27 20:24:37

相關問題