说一说在SpringBoot写单元测试遇到的坑

近期,项目需要写单元测试。我着手的项目是用SpringBoot写的。所以就简单的研究了一下如何使用。在使用中遇到不少问题,不得已换了一种方式写测试用例,写完之后总感觉不太爽。今天在Spring官网上学一个新的用法,发现这种测试方法使用后没有问题。所以来写一点笔记。

SpringBoot怎么写单元测试

SpringBoot提供注解的方式编写单元测试,可以使用SpringBootTest注解来标示测试类。

@RunWith(SpringRunner.class)
@SpringBootTest
@Test
public void method(){
}

这里你如果简单的写测试用例,未跟配置文件有任何挂钩,比如没有数据库配置、数据库连接池配置等。但是如果有这些配置,你就需要这样写了。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@Test
public void method(){
}

这样就可以正常运行了。

我要测试我的controller类。百度了一下使用了Mock,网上大多流传的是下面这种方法,添加@WebAppConfiguration,使用MockMvc去进行单元测试,但是我的项目如下使用就出现了问题,找不到Controller类,很尴尬!!!网上百度了各种方法都不管用,很纳闷。反正就是报 no bean of 'controller' type found错误。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
 public class ControllerTest {

    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext wac;

    @Before // 在测试开始前初始化工作
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }

    @Test
    public void getMessageTest() throws Exception {

        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/test/getMessage"))
                .andDo(MockMvcResultHandlers.print()).andReturn();

        int status = mvcResult.getResponse().getStatus();
        String content = mvcResult.getResponse().getContentAsString();

        Assert.assertTrue("success", status == 200);
        Assert.assertFalse("failed", status != 200);

        System.out.println("content" + content);


    }

然后换了一种方式写,直接new 个controller。测试运行,不报no bean of 'controller' type found错误了。但是在controller中使用的service报了空指针异常。

通过下面的方式,使用了@AutoConfigureMockMvc+@MockBean的方式可以实现简单的单元测试,并且不会对数据产生影响

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@AutoConfigureMockMvc
public class ImkfMessageReportControllerTest {
    /**
     * 初始化MockMvc
     */
    @Autowired
    private MockMvc mvc;

    /**
     * 测试的controller
     */
    @MockBean
    private UserController userController;

    @Test
    public void getUserListTest() throws Exception {
        MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.get("/user/getUserList"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        String content = mvcResult.getResponse().getContentAsString();
        System.out.println("content" + content);

    }

猜你喜欢

转载自blog.csdn.net/xiaoliu598906167/article/details/81668942