0

我正在学习 Spring 并正在考虑将 Spring Test 用于我的 Web 应用程序(JQuery/CXF/Hibernate)。我一直在使用注释来连接我的 bean,并注意到这有时会影响多态性。例如,我有一个GenericDAO所有 DAO 的扩展。它也是简单服务使用的具体类,因此当我为其中一个服务连接它时,所有其他 DAO 都成为运行时连接的候选者(因为多态性)。我可以通过按 type: 显式连接来解决这个问题@Resource(type= GenericDaoImpl.class),但这违背了对接口进行编码的最佳实践..

现在我想使用 . 创建单元测试MockGenericDaoImpl和使用GenericDaoImpl. 我将如何覆盖注释?我猜最好的方法是坚持基于 XML 的接线,这样我就可以有多个版本beans.xml,一个用于 prod,一个用于单元测试,一个用于集成测试,并可能将它们拆分为并行子文件,如需要。这种方法不是比依赖扫描以猜测适当的候选者或约束多态性的注释更灵活吗?有人可以给我关于如何组织我的测试配置设置的广泛指导吗?谢谢!

4

2 回答 2

1

如何使用@Configuration类?如果您不熟悉此方法 - 您可以声明一个替换 XML 上下文文件的类,如下所示:

@Configuration
@ComponentScan({ "com.project.dao"})
public class TestConfiguration {

    @Bean
    public GenericDao getGenericDao() {
         return new MockGenericDaoImpl();
    }
}

@ComponentScan注解中只放相关包进行扫描。通过这种方式,您可以非常灵活地使用正在创建的 bean 以及创建它们的方式。您可以以任何您喜欢的方式向 bean 注入模拟。您还可以创建多个测试配置,每个配置用于不同的目的。为了加载上下文,您需要将此注释放在测试类上:

@ContextConfiguration(classes={TestConfiguration .class})
于 2013-07-04T13:17:20.653 回答
0

使用 XML 配置文件可以防止您依赖 Spring 依赖项。你可以用另一个 DI 框架替换它(也许是 Guice,但这对于我知道的大项目来说是不现实的)。使用 XML 配置文件使您能够干净地编写代码。

我讨厌 XML,但我更讨厌代码中存在非业务逻辑特定的东西。我看到您知道如何使用 XML 配置文件来克服测试问题。我将尝试展示如何使用注释来克服重复实现(一个真正的模拟实现)问题。

您可以通过注释定义您的 bean。您可以使用别名选择实现:

项目.dev.properties:

my.project.dao.xDao=xDaoJpaBean

项目.test.properties:

my.project.dao.xDao=xDaoMockBean

<alias name="${my.project.dao.xDao}" alias="xDao"/>

@Autowired
@Qualifier("xDao")
protected XDao xDao;

因此,您可以仅使用您的属性文件来选择您的实现。如果您想纯粹使用注释,您也可以这样做:

@Autowired
@Qualifier("${my.project.dao.xDao}")
protected XDao xDao;

您的构建环境将指定要加载的属性文件,作为回报,您的 bean 将被分配。

于 2013-07-04T13:42:03.277 回答