2012-06-13 49 views
5

測試依賴於其他服務的Grails服務的最佳做法是什麼? 默認混入TestFor正確注射服務在測試中,如:具有多種服務的Grails集成測試

@TestFor(TopService) 
class TopServiceTests { 
    @Test 
    void testMethod() { 
     service.method() 
    } 
} 

但如果我的TopService(服務)的情況下依靠其他服務,如InnerService:

class TopService { 
    def innerService 
} 

innerService不會可用,依賴注入似乎不填充此變量。我應該如何繼續?

+0

嘗試在您的測試中擴展'GroovyTestCase'。 –

回答

8

集成測試不應該使用@TestFor註釋,它們應該是extend GroovyTestCase。測試註釋僅用於單元測試(並且在集成測試中使用時會有不良行爲,尤其是@Mock註釋)。你現在看到了這些不良行爲之一。

如果擴展GroovyTestCase然後你可以只

def topService 

在測試的頂部,它會與所有它的依賴注入獲得注入。

對於單元測試用例,您只需要在setUp方法中將相關服務的新實例添加到服務中。就像:

@TestFor(TopService) 
class TopServiceTests { 
    @Before public void setUp() { 
     service.otherService = new OtherService() 
    } 
    ... 
+0

謝謝!我終於理解了你的解釋;) 我有點誤導了來自http://stackoverflow.com/questions/2272677/dependency-injection-in-grails-integration-tests的評論「集成測試不應該擴展GrailsUnitTestCase」 。不確定我完全瞭解GroovyTestCase和GrailsUnitTestCase之間的區別...... – Wavyx

+1

最大的區別是(最終讓人咬牙切齒)是單元測試用例在嘲諷和修改setUp和tearDown上的metaClass方面做了很多事情。嘲笑是集成測試不需要的東西,因爲他們已經注入了真實的東西。這也意味着,當集成測試完成時,單元測試tearDown運行是不好的,因爲它可以移除應該在那裏並且後續集成測試期望的metaClass的變化(如動態GORM方法)。 –

1

我有一個CustomerRegistrationServiceTest,我的CustomerRegistrationService依賴於PasswordService。

我CustomerRegistrationService只是autowires它像正常:

class CustomerRegistrationService { 
    def passwordService 

在我CustomerRegistrationServiceTest我:

@TestFor(CustomerRegistrationService) 
@Mock(Customer) 
class CustomerRegistrationServiceTests extends GrailsUnitTestMixin { 

    void setUp() { 
     mockService(PasswordService) 
    } 

所以,當我測試CustomerRegistrationService,它能夠訪問PasswordService

+1

謝謝。事實上,嘲笑似乎是要走的路,但更多的單元測試恕我直言。對於集成測試,我寧願測試完整的環境。 – Wavyx