这个代码库是一个典型的基于Spring的企业级代码库,大约有1.5百万行代码。我们有相当多的Spring上下文文件。测试基础设施存在问题。
对于测试用例,我创建了另一组test-spring文件(主要导入相关项目的Spring上下文),并为某些bean包含外部服务的模拟bean。所有测试类都使用相同的上下文配置文件,90%的情况下一切正常。
但在某些情况下,可能会有一个bean需要被mock。但我不希望编辑spring-text.xml(因为这会干扰所有类),也不希望为每个测试类单独设置一组xml。一个非常简单的方法是:
@Autowired
@Qualifier("fundManager")
FundManager fundManager;
@Test
public void testSomething(){
TransactionManager tx = mock(TransactionManager.class);
fundManager.setTransactionManager(tx);
//now all is well.
}
这在某些情况下是有效的。但有时,希望在代码库中使用 TransactionManager
bean 的所有地方设置这个新的临时bean tx
。
代理类在我看来不是一个好的解决方案,因为我将不得不用包装器包装所有的bean。这正是我理想中的解决方案:
@Test
public void testSomething(){
TransactionManager tx = mock(TransactionManager.class);
replace("transactionManagerBean",tx);
//For bean with id:transactionManagerBean should be replace with `tx`
}
BeanPostProcessor
看起来是一个替代建议,但我在使用它时遇到了一些小问题。
public static class TestConfig
,并用@Configuration
注释该类。测试支持将自动检测此配置类。 - M. Deinum