【发布时间】:2018-04-02 12:21:27
【问题描述】:
假设我们有一个服务层:
@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 调用,获取数据并进行验证。我不想嘲笑他们。
第二个测试是集成测试。我希望我的服务层调用 Dao 层。请注意,有交易。现在这会给我来自 DAO 的数据。同样,DAO 必须连接到 db 才能获取数据。
我正在使用弹簧靴。我的数据库属性存在于 applicationITest.properties 文件中。
如何进行这两项测试?我必须使用的正确注释是什么?谁能举个例子?
【问题讨论】:
-
需要澄清一下:a) 您是在测试服务层还是 DAO 层的事务行为? b) 你想测试 JDBC 代码吗?
-
两者。我想要2个测试。一个检查 (service+dao) 另一个检查 dao。我不想通过模拟检查独立服务层。事情变得复杂,因为我们在服务层也有事务
-
@BreakingBenjamin 您所问的问题已包含在 SPring 文档中。阅读它,并尝试一些东西。在不模拟 DAO 层的情况下测试服务层没有多大意义:测试会更慢、更难编写、更难维护,而且你的服务除了委托给 DAO 之外什么都不做。如果你想测试 Spring 事务是否正常工作,那并没有什么帮助:Spring 已经测试过了。
-
@JBNizet 上面的代码只是一个示例。服务层有很多业务逻辑,调用不止一个 Dao。另外,我阅读了 spring 文档,但不是很清楚。因此,问题。
-
尝试一些东西,在提问之前进行实验。然后,如果卡住了,回到这里,带着你尝试过的东西,以及你遇到的确切问题。当心:你可能会通过这样做学到东西。
标签: java spring spring-mvc spring-boot spring-jdbc