java - spring jdbc集成测试

标签 java spring spring-mvc spring-boot spring-jdbc

假设我们有一个服务层:

@Service
public class MyServiceImpl implements MyService {

    @Autowired
    private MyDAO myDAO;

    @Transactional
    public void myMethod(SomeObject someObject) {
       myDAO.insertIntoMyDb(someObject);

    }
}

假设 myDAO 使用 spring jdbc:

@Repository
public class MyDAOImpl implements MyDAO {

    @Autowired
    private NamedParameterJdbcTemplate jdbcTemplate;

    @Override
    public void insertIntoMyDb(SomeObject object) {

        // some code before this where we get query and param

        int numberOfRowsUpdated = jdbcTemplate.update(query,param);

        if(numberOfRowsUpdated != 1)
            throw new Exception("Error while inserting a record in database. Actual records inserted : " + numberOfRowsUpdated);
    }


}

我想编写 2 个测试。

第一个测试将仅检查我的 dao 层。我想在这里进行jdbc调用,获取数据并验证。我不想 mock 他们。

第二个测试是集成测试。我希望我的服务层调用 Dao 层。注意,有交易。现在这将为我提供来自 DAO 的数据。同样,DAO 必须连接到数据库才能获取数据。

我正在使用 Spring Boot。我的数据库属性存在于 applicationITest.properties 文件中。

如何进行这两个测试?我必须使用的正确注释是什么?有人可以举个例子吗?

最佳答案

a) 只要您使用 @Transactional 注解您的测试类,默认情况下就会发生回滚。关于 Test-managed transactions 的文档.

示例测试类:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MyTestConfig.class)
@Transactional
public class MyClassTest {
   //..

   @Test
   public void myTest() {
      //..
   }

   //..
}

b) 是的,您可以使用 @Commit 强制提交(Spring 4.2中添加)测试注释。 Here's the documentation .

关于java - spring jdbc集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49611202/

相关文章:

java - 如何知道从随机数组列表中使用的最后一个可绘制对象是什么?

java - 如何使用 Jayway JsonPath 等 Java 库添加新的 json 节点

java - 为什么在运行简单的Spring Boot Gradle项目时获得404状态?

java - Spring MultipartFiles 在混合多部分中重复文件

java - Spring RESTful Web 服务和 bean "request"和 "session"范围

java - 如何用spring高效的实现一个策略模式?

java - Java中Spring-Boot微服务的监控指标计算

java - Spring Boot : Unable to read resources in lib/*. jar 使用 lib/*.jar 中的类

java - Quartz & Spring - 集群但不持久?

java - 每次重新启动应用程序时,使用 CrudRepository 的 Spring boot 数据库(Apache Derby)都会被删除