2017-07-15 97 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