首页 > 解决方案 > 如何正确使用 Spring Boot 测试?

问题描述

我不太了解如何正确使用 Spring 中的测试。我真的需要对整个 Spring 配置执行完全初始化来运行测试吗?

我有一个最终的集成测试,一个正常的控制器调用,并检查它的响应。我必须这样做:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class RestControllerTest {
    @Autowired
    HomeRestController homeRestController;
    @Test
    @Repeat(value = 15)
    public void test() throws Exception {
        RequestSearch requestSearch = new RequestSearch();
        HttpServletResponse httpServletResponse = mock(HttpServletResponse.class);
        requestSearch.setMonth(7);
        requestSearch.setYear(2018);
        requestSearch.setGbNumber(5010);
        requestSearch.setPayTime(new Double(32));
        requestSearch.setScanTime(new Double(2.7));
        requestSearch.setWaitTime(new Double(35));
        ReportResponse reportResponse = homeRestController.find(requestSearch, httpServletResponse);

        Assert.assertTrue(reportResponse.cashBoxPlans.size() == 1487);
        Assert.assertTrue(reportResponse.getExcelPath().equals("ExceReport.xls"));

    }
}

查看 Spring 文档后,我发现了一个完美的示例,并希望在测试中添加一个单独的类:

@RunWith(SpringRunner.class)
@WebMvcTest(HomeRestController.class)
public class RestControllerMockTest {
    @Autowired
    private MockMvc mvc;
    @Test
    public void test() throws Exception {
        RequestSearch requestSearch = new RequestSearch();
        requestSearch.setMonth(7);
        requestSearch.setYear(2018);
        requestSearch.setGbNumber(5010);
        requestSearch.setPayTime(new Double(32));
        requestSearch.setScanTime(new Double(2.7));
        requestSearch.setWaitTime(new Double(35));
        mvc.perform(post(HomeRestController.postUrl,requestSearch).accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk());    
    }
 }

但是这个测试不起作用,这是被抛出的异常:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerFactory' defined in class path resource [ru/denisa/configuration/SQLServerDatabaseConfiguration.class]: 

异常( SQLServerDatabaseConfiguration)中提到的配置类是一个用 注释的配置类@Configuration

如果我在测试中添加以下注释:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

然后我得到以下异常:

java.lang.IllegalStateException: Configuration error: found multiple declarations of @BootstrapWith for test class [ru.denisa.test.service.rest.RestControllerMockTest]:

怎么做才对?谢谢!

标签: javaspringspring-bootspring-test

解决方案


稍微简单一点的代码:

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HomeRestController.class)
public class RestControllerMockTest {

}

PS。为了禁用安全性,只需更改 @WebMvcTest(controllers = HomeRestController.class, secure= false)


推荐阅读