假设我们有一个服务层:
@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/