当前位置: 首页 > 知识库问答 >
问题:

与SpringBootTest一起使用MockMvc与使用WebMvcTest之间的区别

谷梁玺
2023-03-14
@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
public class HelloControllerApplicationTest {
    @Autowired    
    private MockMvc mvc;

    @Test
    public void getHello() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().string(equalTo("Greetings from Spring Boot!")));
    }
}
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void getHello() throws Exception {
    mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(content().string(equalTo("Greetings from Spring Boot!")));
    }
}
@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
public class HelloControllerIT {
    
    @LocalServerPort private int port;
    private URL base;
    
    @Autowired private TestRestTemplate template;
    
    @Before public void setUp() throws Exception {
        this.base = new URL("http://localhost:" + port + "/");
    }
    
    @Test public void getHello() throws Exception {
        ResponseEntity < String > response = template.getForEntity(base.toString(), String.class);
        assertThat(response.getBody(), equalTo("Greetings from Spring Boot!"));
    }
}

共有1个答案

弓举
2023-03-14

@springboottest是通用的测试注释。如果您正在寻找的东西在1.4之前做相同的事情,这是您应该使用的。它根本不使用切片,这意味着它将启动完整的应用程序上下文,而根本不自定义组件扫描。

@webmvctest只扫描您定义的控制器和MVC基础结构。就是这样。因此,如果您的控制器对来自服务层的其他bean有一些依赖,测试将不会开始,除非您自己加载该配置或为其提供一个模拟。这是更快的,因为我们只加载你的应用程序的一小部分。此注释使用切片。

阅读文档可能也会对你有所帮助。

 类似资料:
  • 我正在尝试测试一个JAX-RS应用程序,但我不想模拟数据,特别是因为现有的有一个方法 以下是我目前正在尝试的: 我得到以下错误 java.lang.IllegalStateException:配置错误:发现测试类[app.myResourceTest]的@bootstrapwith的多个声明:[@org.springframework.test.context.bootstrapwith(valu

  • 我有一个烧瓶服务器运行在http://127.0.0.1:5000和一个vuejs前端运行http://localhost:8080我已经做了api,并用postman测试了它,一切都如预期的那样工作:( > 将请求发布到/登录- (将请求发送至/登录)- 烧瓶API代码: 登录。vue: 指数vue 当我使用邮递员登录时,我得到的响应为;当我使用邮递员获取url/索引时,我得到响应。数据但当我使

  • 问题内容: 建立: BabelJS(ES2015,React,Stage-1) Webpack React / Redux CommonJS和ES6的新功能。我知道对象实例和方法的静态容器之间的区别,但是我不确定它们分离到模块后的行为。所以我想知道返回实例之间有什么区别(此模式完全有效吗?): 并导出const方法: 方法A:每次导入时都会有一个新实例吗? 方法B:使用对象分解功能的好处之一: 然

  • 问题内容: UPDATE 3 下面的最终工作代码。您需要src文件夹中的ace.js!从库中无法使用,您需要从其站点下载预包装的版本。 上面的代码可以设置ACE窗口的内容。 更新2 这是我的项目看起来像atm的样子,仍然在右上角显示了白色的屏幕,并带有来自WT的红色“正在加载…”消息。下面有更多注释。 当用于编辑器-> doJavaScript(command)时,“ command”变量等于以下

  • 问题内容: 我已经使用Selenium和最初的PhantomJS开发了一些Python脚本。在走向自动下载时,我改用了(带头的)Firefox(运行了),然后选择了无头选项的Chrome,这样我就不会打开浏览器了。 我的第一个脚本访问一个页面和几个HTML元素,与无头Chrome完美搭配。 但是第二个 仅适用于带头的Chrome 。如果添加“无头”选项,它将不再起作用。当我尝试以无头模式打印HTM

  • 我只是很难让我的控制器单元测试正常工作,因为在我看来,如果使用OAuth,SpringDoc中的内容是不够的。在我的例子中,是Oauth2和JWT。 我尝试使用,,甚至使用和自定义定义我自己的注释,但在计算安全表达式时,总是在UserSecurityContext中获得匿名用户,无论我在工厂中设置测试上下文的是什么。。。 我提出了我刚刚想到的解决方案,但由于我不确定嘲笑令牌服务是最有效/干净的方法