2017-07-15 130 views
0

我有一段代碼將在多個集成測試中重複使用。代碼將在測試之前和之後運行。集成測試中的Autowire junit規則

我決定使用JUnit @Rule將是實現此目的的最佳方法。

問題是規則將需要訪問幾個@Autowired spring bean。 (測試與Spring集成測試運行運行,從而自動裝配工作正常

我有一個規則:

public class CustomSpringRule extends ExternalResource { 
    private final SomeOtherBean; 

    public CustomSpringRule(SomeOtherBean someOtherBean) { 
     this.someOtherBean = someOtherBean; 
    } 

    @Override 
    public void before() { 
     someOtherBean.someMethod(); 
    } 
    (...) 
} 

我有我的背景下,我增加了我的豆:

@Bean 
public CustomSpringRule getCustomSpringRule(SomeOtherBean someOtherBean) { 
    return new CustomSpringRule(someOtherBean) 
} 

最後,我剛纔自動裝配測試文件中的規則豆:

@Autowire 
@Rule 
public CustomSpringRule customSpringRule 

這一切工作正常,但我從來沒有真正我們ed @ Rule註釋,我略微擔心JUnit反射和Spring Autowire不能很好地融合在一起,否則會出現一些初看起來不明顯的問題。

有沒有人有任何建議,這是否有效和安全?

+0

它似乎有點代碼味道有測試,需要按特定順序運行。測試應該是彼此獨立的 –

回答

0

我不認爲你需要@Rule在這裏,「我有一段代碼將在多個集成測試中重複使用,代碼將在測試之前和之後運行。」這可以使用JUnit的@Before和@After註釋來實現。用這些註釋標註的方法將在每次測試之前/之後執行。所以你可以從這些方法調用你的通用代碼。

+0

是的,我可以,但我想避免代碼重複,並有一個整齊的規則。另一方面,我不確定我是否應該使用spring bean來做一些測試邏輯。 – Taks

+0

我的意思是保持你的通用代碼不在測試中,以便你可以在所有的測試中使用它。只有調用它纔會重複,就像你上面提到的「someOtherBean.someMethod();」 – ravinikam