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());
它是可能的,以使用两个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);
[...]
}
}
使用MockMvc
,您通常会设置整个web应用程序上下文并模拟HTTP请求和响应。因此,尽管一个假的DispatcherServlet正在启动和运行,模拟MVC堆栈的工作方式,但没有真正的网络连接。
使用RestTem板
,您必须部署一个实际的服务器实例来监听您发送的HTTP请求。
正如本文所述,当您想要测试应用程序的服务器端时,应该使用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