在不提供Setter方法的情况下自动注入
大多数IDE都提供了为属性变量自动生成Setter方法的操作,因此客观地说,为属性编写一个Setter方法的工作根本不值一提。如果你觉得众多的 Setter方法影响了视觉感观,但又希望享受测试类属性自动装配的好处,Spring也不会让你失望的。你需要做的是以下两步的工作:
1) 将需要自动装配的属性变量声明为protected;
2) 在测试类构造函数中调用setPopulateProtectedVariables(true)方法。
java 代码
- package com.baobaotao.test;
- …
- public class DependencyInjectionCtxTest extends AbstractDependencyInjectionSpringContextTests {
- protected UserService userService; ①将属性声明为protected
-
-
-
- public DependencyInjectionCtxTest(){
- setDependencyCheck(false);
- setPopulateProtectedVariables(true); ③启用直接对属性变量进行注释的机制
- }
- …
- }
将属性声明为protected后并通过setPopulateProtectedVariables(true)启用对属性变量直接注入的机制(启用反射机制注入),你就可以避免为属性变量编写对应的Setter方法了。
提示 属性如果声明为public,虽然你也调用了setPopulateProtectedVariables(true)方法,属性变量依然不会被自动注入。所以这种机制仅限于protected的属性变量。
方便地恢复测试数据库现场
我 们现在已经可以通过AbstractDependencyInjectionSpringContextTests的属性自动装配机制方便地建立起测试固 件,省却手工调用getBean()自行准备测试固件的烦恼。当我们对UserService的hasMatchUser()和 findUserByUserName()方法进行测试时,不会有任何问题,因为这两个方法仅对数据库执行读操作。但UserService以下两个接口 方法会对数据库执行更改操作:
java 代码
- void loginSuccess(User user);
- void registerUser(User user);
当我们对这两个接口方法进行测试时,它们将会在数据库中产生持久化数据。考虑对registerUser(User user)方法进行测试时,我们可能编写如下所示的测试方法:
java 代码
- public void testRegisterUser(){
- User user = new User();
- user.setUserId(2);
- user.setUserName("john");
- user.setPassword("123456");
- userService.registerUser(user);
- }
当第一次成功运行testRegisterUser()测试方法时,将在数据库中产生一条主键为2的记录,如何第二次重新运行 testRegisterUser()测试方法其结果将不言自明:因主键冲突导致测试方法执行失败,最终报告测试用例没有通过。在这种情况下,测试用例未 通过并不是因为UserServiceImpl#registerUser(User user)存在逻辑错误,而是因为测试方法的积累效应导致外在设施的现场发生变化而引起的问题。
为了防止这种问题,测试用例必须在保 证不对数据库状态产生持久化变化的情况下,对目标类的数据操作逻辑正确性进行检测。乍一听这一要求有点貌似于“既想马儿跑,又想马儿不吃草”一样充满悖 论,实则不然。只要我们让测试方法不提交事务,在测试完后自动回滚事务,就皆大欢喜了。
分享到:
相关推荐
IOC DI 一个spring4.2.0 spring setter 和构造 注入 的小例子
NULL 博文链接:https://moshow.iteye.com/blog/1606825
Spring依赖注入使用setter设注入demo。完整可运行。
spring的setter注入实现mysql数据库的连接 下载 看看吧
Spring之Construcotrer注入和setter注入不同的XML写法方式 ,具体效果和过程看博文http://blog.csdn.net/evankaka/article/details/44878225
Java开发学习(六)----DI依赖注入之setter及构造器注入解析.doc
NULL 博文链接:https://lixiongqing.iteye.com/blog/2124696
eclipse中setter/getter方法自动添加属性注释,详情参考http://blog.csdn.net/yuxinabc/article/details/49179113
自动生成带注释的getter和setter方法(注释)插件
对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的 依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程(将依赖关系注入到对象中) ,spring的...
eclipse 自动为getter和setter添加中文注释 详细参见 http://blog.csdn.net/kongguoan/article/details/38293137
JavaSpring2 提交1:通过Setter注入配置Spring Bean 提交2:包含通过构造函数注入配置Spring Bean(添加餐类,MyApp包,FileContext路径)
java 的eclipse或idea等 定义变量时 直接引入lombok.jar包 在类外部 引入@AllArgsConstructor @NoArgsConstructor @Data 简便方法引入getter/setter/tostring等方法
6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...
java Eclipse 自动生成setter方法时,去处空格模板;可进行适当修改
20. 哪种依赖注入方式你建议使用,构造器注入,还是 Setter 方法注入? 21.什么是 Spring beans? 22. 一个 Spring Bean 定义 包含什么? 23. 如何给 Spring 容器提供配置元数据? 24. 你怎样定义类的作用域? 25. ...
@Autowired 注解用于自动注入依赖,它可以放置在字段、构造器、setter方法或其他任何方法上,Spring容器会自动寻找并注入正确的bean。 @Configuration 和 @Bean 注解用于Java配置,允许开发者用程序的方式定义Spring...
jfinal model自动生成工具,自带setter与getter
依赖注入、IoC/DI Spring 框架(核心)IoC 容器 IoC:控制反转 DI:依赖注入 什么是依赖?一个组件(对象)的运行需要用到另一个组件(对象),称这种关系为依赖关系 举例:鱼依赖水,生命依赖空气、阳光、水...
Gidot TypeSetter文章自动排版工具