【问题标题】:Spring Boot Restcontroller as inner class in unit test (webmvctest)Spring Boot Restcontroller 作为单元测试中的内部类(webmvctest)
【发布时间】:2020-02-24 08:42:08
【问题描述】:

是否有可能在测试上下文中声明一个 RestController,最好是作为 Spring Boot 测试的内部类?我确实需要它来进行特定的测试设置。我已经尝试过以下简单示例作为 POC:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.client.AutoConfigureWebClient;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;


@ExtendWith(SpringExtension.class)
@WebMvcTest(ExampleTest.TestController.class)
@AutoConfigureMockMvc
@AutoConfigureWebClient
public class ExampleTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void exampleTest() throws Exception {
        ResultActions resultActions = this.mockMvc
                .perform(get("/test"));
        resultActions
                .andDo(print());
    }

    @RestController
    public static class TestController {
        @GetMapping("/test")
        public String test() {
            return "hello";
        }
    }

}

虽然通过 MockMvc 测试端点会提供 404。我错过了什么吗?

【问题讨论】:

    标签: java spring-boot unit-testing spring-mvc inner-classes


    【解决方案1】:

    问题是,TestController 没有加载到应用程序上下文中。可以通过添加来解决

    @ContextConfiguration(classes= ExampleTest.TestController.class)

    测试将如下所示:

    @ExtendWith(SpringExtension.class)
    @WebMvcTest(ExampleTest.TestController.class)
    @ContextConfiguration(classes= ExampleTest.TestController.class)
    @AutoConfigureMockMvc
    @AutoConfigureWebClient
    public class ExampleTest {
    
        @Autowired
        private MockMvc mockMvc;
    
        @Test
        public void exampleTest() throws Exception {
            ResultActions resultActions = this.mockMvc
                    .perform(get("/test"));
            resultActions
                    .andDo(print());
        }
    
        @RestController
        public static class TestController {
            @GetMapping("/test")
            public String test() {
                return "hello";
            }
        }
    
    }
    

    还有输出:

    MockHttpServletResponse:
               Status = 200
        Error message = null
              Headers = [Content-Type:"text/plain;charset=UTF-8", Content-Length:"5"]
         Content type = text/plain;charset=UTF-8
                 Body = hello
        Forwarded URL = null
       Redirected URL = null
              Cookies = []
    

    【讨论】:

    • 就是这样!非常感谢!尽管(在使用它时)为我关于 spring 安全性的特定测试设置添加了一些配置类到 ContextConfiguration,但那是另一个故事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 2017-02-08
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    相关资源
    最近更新 更多