【问题标题】:How test JdbcTemplate methods using jUnit?如何使用 jUnit 测试 JdbcTemplate 方法?
【发布时间】:2021-12-30 12:45:16
【问题描述】:

我使用 Spring 和 JdbcTemplate 编写了简单的 java 项目。我编写了 SpringConfig 类,在其中放置了我的 Postgres 数据库信息并创建了 DataSource 和 JdbcTemplate bean。然后我用 Autowired 类构造函数编写了 CRUD 方法,一切都运行得很完美,但测试没有。我想使用 H2 数据库并在 test.resources 包中创建 application.properties,然后创建测试类,在其中创建类构造函数并自动装配它,当我尝试测试 CRUD 方法时,我得到 ParameterResolutionException:“无法解析参数 [ javax.sql.DataSource arg0] 在构造函数中”。能否请您指出我的错误:

@Configuration
public class SpringConfig {

private static final String URL = "jdbc:postgresql://localhost:5432/test";
private static final String DRIVER = "org.postgresql.Driver";
private static final String USERNAME = "root";
private static final String PASSWORD = "123";

@Bean
public DataSource dataSource() {

    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(DRIVER);
    dataSource.setUrl(URL);
    dataSource.setUsername(USERNAME);
    dataSource.setPassword(PASSWORD);
    return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(){
    return new JdbcTemplate(dataSource());
}
@Repository
public interface SimpleDao<E> {

void create(E e);

Optional<E> read(int id);

void delete(E e);

void update(E e);

List<E> index();
}
public interface StudentDao extends SimpleDao<Student> {
}
@Component
public class SpringStudentDao implements StudentDao {
private static Logger logger = LoggerFactory.getLogger(SpringStudentDao.class);

private final JdbcTemplate jdbcTemplate;

public SpringStudentDao(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
}

@Override
public void create(Student student) {
    String sql = "INSERT INTO student VALUES(?,?,?)";
    int insert = jdbcTemplate.update(sql, student.getID(), student.getName(), student.getSurname());
    if (insert == 1) {
        logger.info("New student added " + student.toString());
    }
}

@Override
public Optional<Student> read(int id) {
    String sql = "SELECT * FROM student WHERE id=?";
    Student student = null;
    try {
        student = jdbcTemplate.queryForObject(sql, new Object[]{id}, new StudentMapper());
    } catch (DataAccessException exception) {
        logger.info("Student not found " + id);
    }
    return Optional.ofNullable(student);
}

@Override
public List<Student> index() {
    String sql = "SELECT * FROM student";
    return jdbcTemplate.query(sql, new StudentMapper());
}
@DataJdbcTest
class SpringStudentDaoTest {

private JdbcTemplate jdbcTemplate;
private SpringStudentDao studentDao;


@Autowired
public SpringStudentDaoTest(DataSource dataSource){
    jdbcTemplate = new JdbcTemplate(dataSource);
    studentDao = new SpringStudentDao(jdbcTemplate);

}

@Test
public void shouldGetListOfStudents(){
    List<Student> students = studentDao.index();
    assertEquals(4, students.size());
}

【问题讨论】:

    标签: java spring junit jdbctemplate


    【解决方案1】:

    您为什么尝试为您的嵌入式数据库构建 JdbcTemplate 而不是自动装配自动配置的数据库?

    @DataJdbcTest
    public class JdbcTest {
    
        JdbcTemplate jdbcTemplate;
    
        @Autowired
        JdbcTest(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }
    
        @Test
        public void myTest() {
        }
    
    }
    

    Auto-configured Data JDBC Tests@DataJdbcTest 上查看信息

    默认情况下,它配置一个内存嵌入式数据库、一个 JdbcTemplate 和 Spring Data JDBC 存储库。常规 @Component bean 不会加载到 ApplicationContext 中。

    @DataJdbcTest 自动配置的组件的完整列表 - 请参阅 Appendix D. Test auto-configuration annotations

    org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration org .springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration org.springframework.boot.test .autoconfigure.jdbc.TestDatabaseAutoConfiguration

    为什么你的方法失败了:

    如果您熟悉 Spring 测试框架,您可能习惯于使用 @ContextConfiguration(classes=...​) 来指定要加载的 Spring @Configuration。或者,您可能经常在测试中使用嵌套的 @Configuration 类。

    【讨论】:

      猜你喜欢
      • 2012-10-24
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 2016-03-12
      • 2021-12-26
      • 1970-01-01
      相关资源
      最近更新 更多