2017-03-23 71 views
1

我正在運行使用TestNG作爲測試框架的Spring引導應用程序。我的測試設置是這樣的:未注入到BeforeSuite方法中的Spring依賴關係?

父類,它負責建立邏輯的,並採取所有配置的東西的護理:

@ContextConfiguration(classes = {TestingConfig.class}, initializers = ConfigFileApplicationContextInitializer.class) 
@ContextConfiguration(classes = TestConfig.class) 
@TestPropertySource(locations = "classpath:application.yml") 
public abstract ParentTestClass extends AbstractTestNGSpringContextTests { 

    @Autowired 
    private ServiceClient serviceClient; 

    @BeforeSuite 
    public void beforeClass() { 

     Assert.assertNotNull(serviceClient); 

     serviceClient.doSomeSetupWork(); 
    } 
} 

有多個孩子的測試類。每個繼承都構成父測試類,以便它們共享相同的設置邏輯。

public ChildTestClass1 extends ParentTestClass { 

    @Test 
    public void someTest() { 
    ... 
    } 

    // More tests not shown 
} 

public ChildTestClass2 extends ParentTestClass { 

    @Test 
    public void anotherTest() { 
    ... 
    } 

    // More tests not shown 
} 

serviceClient是測試套件所依賴的Web服務之一的客戶端。在運行測試用例之前,我正在與服務客戶端進行通話以設置其他服務中的數據。

問題是這樣的:以前我使用@BeforeClass註釋,這意味着父類的設置方法正在爲每個子測試類運行一次。這是好的,但它真的很慢,等待相同的設置多次運行。

所以我想:我只是將ParentTestClass中的@BeforeClass註釋更改爲@BeforeSuite!這將解決我所有的問題!

錯誤。

現在,當我運行它時,父類的beforeClass()方法中的Assert.assertNotNull(serviceClient);行失敗。 簡而言之,Spring依賴關係並沒有被注入@BeforeSuite註釋的方法,即使是在注入方法@BeforeClass時它們被注入到方法中也不會被注入到中。

有什麼想法嗎?我真的很感激它!

回答

2

我相信這是按照設計工作的。從看看如何在org.springframework.test.context.testng.AbstractTestNGSpringContextTests(從中擴展)中構建實現,通過org.springframework.test.context.support.DependencyInjectionTestExecutionListener#injectDependencies(這是一個監聽器)將依賴關係注入到測試類中。 所有收聽者,包括DependencyInjectionTestExecutionListener僅通過org.springframework.test.context.testng.AbstractTestNGSpringContextTests#springTestContextPrepareTestInstance調用,這是@BeforeClass(alwaysRun=true)分類方法。

因此,直到完成此註釋的方法運行才能使用您的依賴關係。因此,您必須移除@BeforeSuite方法,並且只能使用@BeforeClass註釋。

如果您不需要多次完成服務設置,那麼您需要在測試代碼中添加一個編輯檢查,該檢查代碼僅在未完成設置時才執行設置

+0

非常不幸的是,他們只實現了它與BeforeClass註釋一起使用......它會爲我創造一大堆額外的工作:/感謝您爲它揭開一些光芒! – jtcotton63