======== 测试优化 ======== 利用Before注解,将每个测试用例开始部分都会执行的代码封装到独立的方法中: public class SpringJDBCTest02 { private JdbcTemplate jdbcTemplate; @Before public void init() { // 获取Spring上下文 ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml"); // 获取JDBC模板 jdbcTemplate = ctx.getBean("jdbcTemplate", JdbcTemplate.class); } @Test public void test01() { // 获取行数 String sql = "select count(1) from t_account"; int nrows = jdbcTemplate.queryForObject(sql, Integer.class); System.out.println(getClass().getName() + "." + Thread .currentThread().getStackTrace()[1].getMethodName() + ": " + nrows); } @Test public void test02() { // 获取行数 String sql = "select count(1) from t_account where user_id = ?"; int nrows = jdbcTemplate.queryForObject(sql, Integer.class, 1); System.out.println( getClass().getName() + "." + Thread .currentThread().getStackTrace()[1].getMethodName() + ": " + nrows); } } 通过注解启动Spring环境,并注入JDBC模板: @RunWith(SpringJUnit4ClassRunner.class) // 在Spring环境中运行测试用例 @ContextConfiguration(locations = {"classpath:spring.xml"}) // 指定Spring配置文件 public class SpringJDBCTest03 { @Autowired // 按类型注入 private JdbcTemplate jdbcTemplate; @Test public void test01() { // 获取行数 String sql = "select count(1) from t_account"; int nrows = jdbcTemplate.queryForObject(sql, Integer.class); System.out.println(getClass().getName() + "." + Thread .currentThread().getStackTrace()[1].getMethodName() + ": " + nrows); } @Test public void test02() { // 获取行数 String sql = "select count(1) from t_account where user_id = ?"; int nrows = jdbcTemplate.queryForObject(sql, Integer.class, 1); System.out.println( getClass().getName() + "." + Thread .currentThread().getStackTrace()[1].getMethodName() + ": " + nrows); } } 也可以通过Resource注解注入JDBC模板: @RunWith(SpringJUnit4ClassRunner.class) // 在Spring环境中运行测试用例 @ContextConfiguration(locations = {"classpath:spring.xml"}) // 指定Spring配置文件 public class SpringJDBCTest04 { @Resource // 按名字注入 private JdbcTemplate jdbcTemplate; @Test public void test01() { // 获取行数 String sql = "select count(1) from t_account"; int nrows = jdbcTemplate.queryForObject(sql, Integer.class); System.out.println(getClass().getName() + "." + Thread .currentThread().getStackTrace()[1].getMethodName() + ": " + nrows); } @Test public void test02() { // 获取行数 String sql = "select count(1) from t_account where user_id = ?"; int nrows = jdbcTemplate.queryForObject(sql, Integer.class, 1); System.out.println( getClass().getName() + "." + Thread .currentThread().getStackTrace()[1].getMethodName() + ": " + nrows); } } 与Spring提供的默认按类型注入的Autowired注解不同,默认按名字注入的Resource注解由J2EE提供,需要在pom.xml文件中添加相应依赖: javax.annotation javax.annotation-api 1.3.2 将用于启动Spring环境的注解放到测试基类中: @RunWith(SpringJUnit4ClassRunner.class) // 在Spring环境中运行测试用例 @ContextConfiguration(locations = {"classpath:spring.xml"}) // 指定Spring配置文件 public class SpringJDBCTest { } 执行具体测试任务的类从测试基类继承: public class SpringJDBCTest05 extends SpringJDBCTest { @Resource // 按名字注入 private JdbcTemplate jdbcTemplate; @Test public void test01() { // 获取行数 String sql = "select count(1) from t_account"; int nrows = jdbcTemplate.queryForObject(sql, Integer.class); System.out.println(getClass().getName() + "." + Thread .currentThread().getStackTrace()[1].getMethodName() + ": " + nrows); } @Test public void test02() { // 获取行数 String sql = "select count(1) from t_account where user_id = ?"; int nrows = jdbcTemplate.queryForObject(sql, Integer.class, 1); System.out.println( getClass().getName() + "." + Thread .currentThread().getStackTrace()[1].getMethodName() + ": " + nrows); } }