Java Spring测试:更好地使用XML配置而不是注释?
我正在学习Spring,并打算在我的web应用程序(JQuery/CXF/Hibernate)中使用Spring测试。我一直在使用注释来连接我的bean,并注意到这有时会妨碍多态性。例如,我有一个由所有DAO扩展的Java Spring测试:更好地使用XML配置而不是注释?,java,spring,spring-test,Java,Spring,Spring Test,我正在学习Spring,并打算在我的web应用程序(JQuery/CXF/Hibernate)中使用Spring测试。我一直在使用注释来连接我的bean,并注意到这有时会妨碍多态性。例如,我有一个由所有DAO扩展的GenericDAO。它也是简单服务使用的一个具体类,因此当我为其中一个服务连接它时,所有其他DAO都成为运行时连接的候选对象(因为多态性)。我可以通过按类型显式连接来解决这个问题:@Resource(type=GenericDaoImpl.class),但这与编写接口的最佳实践背道而
GenericDAO
。它也是简单服务使用的一个具体类,因此当我为其中一个服务连接它时,所有其他DAO都成为运行时连接的候选对象(因为多态性)。我可以通过按类型显式连接来解决这个问题:@Resource(type=GenericDaoImpl.class)
,但这与编写接口的最佳实践背道而驰
现在我想使用MockGenericDaoImpl
创建单元测试,并使用GenericDaoImpl
创建集成测试。我将如何覆盖注释?我猜最好的方法是坚持基于XML的连接,这样我就可以有多个版本的beans.XML
,一个用于prod,一个用于单元测试,一个用于集成测试,并可能根据需要将它们拆分为并行子文件。这种方法不是比依赖于注释更灵活吗?这些注释要么扫描以猜测合适的候选对象,要么约束多态性?
有人能给我一些关于如何组织我的测试配置设置的大致指导吗?谢谢大家! 使用
@Configuration
类怎么样?如果不熟悉此方法,可以声明一个类来替换XML上下文文件,如下所示:
@Configuration
@ComponentScan({ "com.project.dao"})
public class TestConfiguration {
@Bean
public GenericDao getGenericDao() {
return new MockGenericDaoImpl();
}
}
在@ComponentScan
注释中,只需扫描相关的包。通过这种方式,您可以非常灵活地使用正在创建的bean以及创建它们的方式。你可以用任何你喜欢的方式给豆子注射mock。
您还可以创建多个测试配置,每个配置用于不同的目的。为了加载上下文,您需要将此注释放在测试类上:
@ContextConfiguration(classes={TestConfiguration .class})
使用XML配置文件可以防止依赖Spring依赖项。您可以用另一个DI框架(可能是Guice,但对于我知道的大型项目来说,这是不现实的)。使用XML配置文件使您能够干净地编写代码 我讨厌XML,但我更讨厌代码中不存在特定于业务逻辑的东西。 我知道您知道如何使用XML配置文件克服测试问题。我将尝试展示如何使用注释克服实现重复(一个真实的一个模拟实现)问题 您可以通过注释定义bean。您可以使用别名选择实现: project.dev.properties:
my.project.dao.xDao=xDaoJpaBean
project.test.properties:
my.project.dao.xDao=xDaoMockBean
因此,您可以仅使用属性文件选择实现。如果您想纯粹使用注释,也可以这样做:
@Autowired
@Qualifier("${my.project.dao.xDao}")
protected XDao xDao;
您的构建环境将指定要加载的属性文件,作为回报,您的bean将被分配。谢谢您的回答。这难道不完全等同于使用xml配置文件吗?还是这种基于java的方法提供了更多的选择/灵活性?我相信你所描述的一切都可以用xml来完成。无论如何,与注释方法相比,我更喜欢这两种方法,原因我已经在上面解释过了。它给了你更多的灵活性。我在这里给出了一个简单的示例,但例如,在XML中不能使用“if”子句。
@Autowired
@Qualifier("${my.project.dao.xDao}")
protected XDao xDao;