java - 如何编写接口自定义保存方法的测试用例
问题描述
在为我的项目编写 jUnit 时,我遇到了一段代码,我不知道如何处理 jUnit。下面是我尝试编写 jUnit 的代码。
@Repository
public interface PrescriptionRepository extends CrudRepository<Prescription,
Integer> {
@Modifying
@Transactional
@Query(value = "insert ignore into prescription (dose_id,med_id) values (:doseId,:medId)", nativeQuery = true)
public void savePrescription(@Param("doseId") int doseId, @Param("medId") int medId);
}
}
感谢您提前提供的所有帮助。
解决方案
要通过 Spring 测试该接口生成的类的行为,首先需要 Spring 容器。
然后,如果您想编写单元测试(而不是完整的集成测试),则需要使用嵌入式 DB(例如 H2)。
通常,您不想加载整个 Spring 容器,而只想加载 JPA Spring 组件的一部分。
如果您使用 Spring Boot,切片测试功能@DataJpaTest
将非常有帮助。
然后关于测试部分,它相当简单:在您的单元测试中调用您的保存方法,然后使用存储库方法检索插入的数据。
最后断言你得到了预期的对象。
import org.junit.*;
import org.junit.runner.*;
import org.springframework.boot.test.autoconfigure.orm.jpa.*;
import static org.assertj.core.api.Assertions.*;
@RunWith(SpringRunner.class)
@DataJpaTest
public class PrescriptionRepositoryTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private PrescriptionRepository repository;
@Test
public void savePrescription() throws Exception {
this.repository.savePrescription(...);
Prescription actualPrescription = em.findById(...);
assertThat(actualPrescrition.getDoseId()).isEqualTo("doseId...");
assertThat(actualPrescrition.getMedId()).isEqualTo("medId...");
}
}
推荐阅读
- reactjs - 在特定 Array 元素中添加 className 的解决方案
- c# - 处理事务(进程 ID X)在锁上死锁
- django - 在 Django 2 中重定向和反向如何与 kwargs 一起工作?
- node.js - 如何通过 NodeJs 中的异步调用发出 POST 请求
- django - Django 检索组 ChoiceField 的键
- jboss - ActiveMQ 有正确的方言,但 SQL 语句不正确 AUTO_INCREMENT 而不是 IDENTITY 表创建
- javascript - 忽略 Google Cloud Console 测试中已完成功能的异常
- email - 从 kubernetes pod 发送电子邮件
- javascript - 未捕获的 SyntaxError:js 中带有 php 的意外标识符
- ios - 当 UICollectionViewCell 不调整大小时不应用前导和尾随约束