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

集成测试中MockMvc和RestTemplate的区别

蒲昊
2023-03-14

MockMvc和RestTemplate都用于与Spring和JUnit的集成测试。

问题是:它们之间有什么区别?我们什么时候应该选择它们?

以下是两个选项的示例:

//MockMVC example
mockMvc.perform(get("/api/users"))
            .andExpect(status().isOk())
            (...)

//RestTemplate example
ResponseEntity<User> entity = restTemplate.exchange("/api/users",
            HttpMethod.GET,
            new HttpEntity<String>(...),
            User.class);
assertEquals(HttpStatus.OK, entity.getStatusCode());

共有3个答案

宿嘉
2023-03-14

它是可能的,以使用两个RestTem板和MockMvc!

如果您有一个单独的客户机,其中已经完成了Java对象到URL的繁琐映射以及Json的转换,并且希望在MockMVC测试中重用这些映射,那么这将非常有用。

以下是如何做到这一点:

@RunWith(SpringRunner.class)
@ActiveProfiles("integration")
@WebMvcTest(ControllerUnderTest.class)
public class MyTestShould {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void verify_some_condition() throws Exception {

        MockMvcClientHttpRequestFactory requestFactory = new MockMvcClientHttpRequestFactory(mockMvc);
        RestTemplate restTemplate = new RestTemplate(requestFactory);

        ResponseEntity<SomeClass> result = restTemplate.getForEntity("/my/url", SomeClass.class);

        [...]
    }

}
解鸿运
2023-03-14

使用MockMvc,您通常会设置整个web应用程序上下文并模拟HTTP请求和响应。因此,尽管一个假的DispatcherServlet正在启动和运行,模拟MVC堆栈的工作方式,但没有真正的网络连接。

使用RestTem板,您必须部署一个实际的服务器实例来监听您发送的HTTP请求。

仰成天
2023-03-14

正如本文所述,当您想要测试应用程序的服务器端时,应该使用MockMvc

SpringMVC测试建立在来自SpringTest的模拟请求和响应之上,不需要运行的servlet容器。主要区别在于,实际的SpringMVC配置是通过TestContext框架加载的,请求是通过实际调用DispatcherServlet和运行时使用的所有相同的SpringMVC基础结构来执行的。

例如:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration("servlet-context.xml")
public class SampleTests {

  @Autowired
  private WebApplicationContext wac;

  private MockMvc mockMvc;

  @Before
  public void setup() {
    this.mockMvc = webAppContextSetup(this.wac).build();
  }

  @Test
  public void getFoo() throws Exception {
    this.mockMvc.perform(get("/foo").accept("application/json"))
        .andExpect(status().isOk())
        .andExpect(content().mimeType("application/json"))
        .andExpect(jsonPath("$.name").value("Lee"));
  }}

当你想要测试Rest Client端应用程序时,应该使用的RestTem板

如果您有使用RestTem板的代码,您可能想要测试它,并且可以针对正在运行的服务器或模拟RestTem板。客户端REST测试支持提供了第三种选择,即使用实际的RestTemboard,但使用自定义的ClientHttp刚需工厂来配置它,该自定义检查实际请求的期望并返回存根响应。

例子:

RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);

mockServer.expect(requestTo("/greeting"))
  .andRespond(withSuccess("Hello world", "text/plain"));

// use RestTemplate ...

mockServer.verify();

也读这个例子

 类似资料:
  • 我有以下测试类: 这将导致HTTP 200而不是401。我启用了组件扫描和自动配置,并在我的SecuityConfiguration类中配置了Spring Security性,如下所示: 如果我使用RestTemplate访问,那么我将获得预期的行为(HTTP 401)。 null 因此,我不希望手动添加安全过滤器链,因为我(不正确?)期望这“只是工作”由于自动配置魔术在Spring引导? 提前谢

  • 我正在尝试为我的Spring项目运行集成测试,它是一个简单的get方法,用于从DB返回给定id的字符串输出。但是在Mockmvc中,我一直在Mockmvc上得到一个NullPointerException。在我的测试范围内执行。 以下是测试: 这里是控制器-输出控制器: 完全错误是:

  • 本文向大家介绍单元测试和集成测试之间的区别,包括了单元测试和集成测试之间的区别的使用技巧和注意事项,需要的朋友参考一下 众所周知,测试是任何应用程序或软件交付过程中最重要的阶段,因为测试不仅可以验证应用程序的质量,还可以为开发人员提供改进其产品的机会。 每个应用程序都以某种高级或低级语言进行开发,这意味着已经为其开发编写了一些代码,因此在要测试的模块的基础上,存在测试的分类,即单元测试和集成测试。

  • Spring对MockMvc有2个设置: 独立设置 WebApplication Context安装 一般来说,MockMvc用于哪种测试?单元还是集成?或者两者兼而有之? 使用独立设置(运行在Spring应用程序上下文之外)允许您编写单元测试,而使用WebApplication Context设置您可以编写集成测试,这是对的吗?

  • 我想为类“ImageController”创建单元测试。由于映像必须由创建的用户拥有,所以我希望在执行单元测试之前创建一个用户(使用@before)。如何创建此用户?在测试UserController本身时,我做了如下操作:

  • 单元测试 单元测试仅依赖于源代码,是测试代码逻辑是否符合预期的最简单方法。 运行所有的单元测试 make test 仅测试指定的package # 单个package make test WHAT=./pkg/api # 多个packages make test WHAT=./pkg/{api,kubelet} 或者,也可以直接用go test go test -v k8s.io/kubernet