2014-02-14 137 views
2

我想運行服務的單元測試。我想測試的方法包括一些log.debug()聲明。雖然log屬性在運行時注入的,它似乎並沒有在測試中被注入,所以它拋出groovy.lang.MissingPropertyException: No such property: log for class:Grails單元測試服務MissingProperty'log'

這是我的單元測試類:

@TestFor(ServiceUnderTest) 
@Mock([ServiceUnderTest]) 
class ServiceUnderTestTests { 

    def test() { 
     def mock = [ mockedProp: [...] ] as ServiceUnderTest 
     def info = mock.doOperation() 
     assert .... 
    } 
} 

我也嘗試添加MockUtils.mockLogging(ServiceUnderTest)但沒有成功。

如何在單元測試中正確注入我的服務類中的日誌屬性?

回答

4

您不必擁有用@Mock([ServiceUnderTest])註釋的測試類。 @TestFor(ServiceUnderTest)檢測到它的服務類,並自動執行所有的模擬。它還將service屬性添加到可以在所有測試方法中訪問的測試類,並相應地嘲笑log屬性。

我認爲這個問題爲什麼沒有嘲諷,也沒有明確的日誌,MockUtils.mockLogging(ServiceUnderTest)嘲諷確實工作你的情況是你正在使用的測試方法的代碼as威逼:

def mock = [ mockedProp: [...] ] as ServiceUnderTest 

Groovy的內部使用java.lang.reflect.Proxy創建一個代理從ServiceUnderTest後裔類。代理類不會看到對ServiceUnderTest元類的更改,例如添加的log屬性。

我會通過使用每個對象元類使用來解決此問題。您可以通過更改service對象的metaClass來模擬屬性獲取器(或設置器)。請注意,元類更改由Grails在執行測試方法之間回退:

service.metaClass.mockedProp = {-> ... } 
+0

謝謝你的工作。 Groovy非常強大,在特定問題上使用正確的方式很難...... – matcauthon

+0

是的,幕後發生了很多事情。有時候,就像在這個例子中,你需要知道一些這些東西:-) –