首页 > 解决方案 > 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 中插入数据的情况下对其进行测试吗?

标签: spring-bootjunitmockito

解决方案


从概念上讲,当我们测试服务时,我们模拟存储库而不是注入。

您需要模拟您的存储库并设置返回数据的行为。

一个例子 :

@MockBean
XYZRepository xyzRepository;

@Test
public void test() {

    // other mocks
    //
    when(xyzRepository.findAll()).thenReturn(Arrays.asList(new XYZ()));

    // service calls
    // assertions
}

推荐阅读