Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring测试:更好地使用XML配置而不是注释?_Java_Spring_Spring Test - Fatal编程技术网

Java Spring测试:更好地使用XML配置而不是注释?

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),但这与编写接口的最佳实践背道而

我正在学习Spring,并打算在我的web应用程序(JQuery/CXF/Hibernate)中使用Spring测试。我一直在使用注释来连接我的bean,并注意到这有时会妨碍多态性。例如,我有一个由所有DAO扩展的
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;