如何正确使用 spring 引导测试?

How to use the spring boot tests correctly?

我不太明白如何正确使用 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 文档后,我找到了一个完美的示例,并想添加一个单独的 class 测试:

@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)中提到的配置class是配置class注释为@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]:

怎么做才对?谢谢!

试试这个。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MainApp.class)
@EnableWebMvc
@AutoConfigureMockMvc
public class RestControllerMockTest {
@Autowired
HomeRestController homeRestController;

@Before
public void setUp(){
    MockitoAnnotations.initMocks(this);
}

}

稍微简单一点的代码:

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

}

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