spring-boot - CrudRepository 测试用例,无需在数据库中插入数据
问题描述
我有一个实现 CrudRepository 的存储库类。然后在服务类中,我自动连接了这个存储库。然后在控制器类中,我自动连接了此服务。
我想写控制器类的测试用例。我正在使用以下配置。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class XYZControllerTest {
MockMvc mockMvc;
@Mock
private XYZController xyzController;
@Autowired
private TestRestTemplate template;
@Autowired
XYZRepository xyzRepository;
@Before
public void setup() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(xyzController).build();
}
@Test
public void testPanelShouldBeRegistered() throws Exception {
HttpEntity<Object> xyz = getHttpEntity("{\"name\": \"test 1\", \"email\": \"test10000000000001@gmail.com\","
+ " \"registrationNumber\": \"41DCT\",\"registrationDate\":\"2018-08-08T12:12:12\" }");
ResponseEntity<XYZ> response = template.postForEntity("/api/xyz", xyz, XYZ.class);
}
}
我的问题是,当我运行测试用例时,数据将插入用于应用程序的数据库中。我可以在不向 DB 中插入数据的情况下对其进行测试吗?
解决方案
从概念上讲,当我们测试服务时,我们模拟存储库而不是注入。
您需要模拟您的存储库并设置返回数据的行为。
一个例子 :
@MockBean
XYZRepository xyzRepository;
@Test
public void test() {
// other mocks
//
when(xyzRepository.findAll()).thenReturn(Arrays.asList(new XYZ()));
// service calls
// assertions
}
推荐阅读
- karate - 如何在运行时在空手道中创建和传递或多或少的 json 有效负载
- pyspark - 如何在不使用 pyspark 中的 paramgrid Builder 的情况下执行交叉验证?
- math - 给定数字属于哪个表?
- unix - 操作系统:IRETQ 指令
- sql - SQL 查询错误:在预期条件的上下文中指定的非布尔类型的表达式,靠近 ')'
- c# - 逗号作为 DataGrid 中的小数分隔符
- python - 从后到前拆分数据框
- mysql - 无法为签名“字符”、“缺失”找到函数“dbReadTable”的继承方法
- php - 如何使用 Bol Api 获取报告统计信息?
- python - 为什么这个变量会自动舍入?