2010-04-09 143 views
43

Spring支持JUnit的很好的是: 隨着RunWithContextConfiguration註釋,事情看起來很直觀春天依賴注入使用TestNG

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:dao-context.xml") 

本次測試將能夠在Eclipse &的Maven在正常運行兩者。 我不知道TestNG是否有類似的東西。我正在考慮轉向這個「下一代」框架,但我沒有找到與Spring進行測試的匹配。

回答

51
+0

感謝。這正是我要找的。 – 2010-04-10 03:20:36

+4

真是一團糟。首先執行特定的類層次結構。其次,由於使用'@ Transactional'的測試用例可能錯誤地擴展了非事務版本,所以很令人困惑。但不幸的是,在TestNG中沒有其他方法來使用Spring。 – 2014-10-22 09:53:44

+0

@GrzesiekD。我希望在4.5年後有所改變。 :)所以請重新檢查現狀。 – lexicore 2014-10-22 09:55:21

23

這裏是爲我工作的例子:

import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; 
import org.testng.annotations.Test; 

@Test 
@ContextConfiguration(locations = {"classpath:applicationContext.xml"}) 
public class TestValidation extends AbstractTestNGSpringContextTests { 

    public void testNullParamValidation() { 
     // Testing code goes here! 
    } 
} 
17

春天和T estNG在一起工作得很好,但有些事情要注意。除了繼承AbstractTestNGSpringContextTests之外,您還需要了解它如何與標準TestNG setup/teardown註釋交互。

TestNG中有四個層次設置的

  • BeforeSuite
  • BeforeTest
  • BeforeClass
  • BeforeMethod

發生完全按照自己的預期(自文檔的API很好的例子)。這些都有一個可選的值,名爲「dependsOnMethods」,它可以接受一個String或String [],它是同級別方法的名稱或名稱。

AbstractTestNGSpringContextTests類有一個名爲springTestContextPrepareTestInstance的BeforeClass批註方法,如果您在其中使用自動裝配類,則必須將安裝方法設置爲依賴於它。對於方法,您不必擔心自動裝配,因爲它是在類方法之前設置測試類時發生的。

這只是留下了如何在使用BeforeSuite註釋的方法中使用自動裝配類的問題。你可以通過手動調用springTestContextPrepareTestInstance來做到這一點 - 雖然它沒有默認設置,但我已經成功完成了好幾次。

所以,爲了說明這一點,奧雅納的例子的修改版本:

import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; 
import org.testng.annotations.Test; 

@Test 
@ContextConfiguration(locations = {"classpath:applicationContext.xml"}) 
public class TestValidation extends AbstractTestNGSpringContextTests { 

    @Autowired 
    private IAutowiredService autowiredService; 

    @BeforeClass(dependsOnMethods={"springTestContextPrepareTestInstance"}) 
    public void setupParamValidation(){ 
     // Test class setup code with autowired classes goes here 
    } 

    @Test 
    public void testNullParamValidation() { 
     // Testing code goes here! 
    } 
} 
+0

方法org.springframework.test.context.testng。AbstractTestNGSpringContextTests#springTestContextPrepareTestInstance已經有註解@BeforeClass,所以這個解決方案在我看來是多餘的。 – 2014-07-08 09:37:36

+1

該解決方案允許您將自動編譯字段相關的代碼添加到您的測試中。作爲「before class」方法的「springTestContextPrepareTestInstance」並不保證它會在子類的「before class」之前運行 - 您需要明確設置dependsOnMethods字段 – romeara 2014-08-26 20:39:52

+2

不幸的是,這對我不起作用。默認情況下,@ Autowire似乎很晚纔會在@BeforeTest(但在@Test之前)之後發生。我嘗試添加dependsOnMethods,但後來我得到:MyClass取決於方法protected void org.springframework.test.context.testng.AbstractTestNGSpringContextTests.springTestContextPrepareTestInstance()拋出java.lang.Exception,它不用@Test註釋... – dmansfield 2015-05-01 20:17:22