Mockito 在 put 请求中给出错误
Mockito gives error in put request
我正在尝试对 REST 服务进行模拟测试,将数据更新到给定 ID 的数据库。
我试过 Add(POST request) 效果很好。
但是当我尝试 PUT 请求时它给了我一个错误:
Argument(s) are different! Wanted:
service.updateMet(
Met [id=10, name=mnTest, definition=mdTest]
);
-> at org.MetApp.MetTest.updateMet(MetTest.java:175)
Actual invocation has different arguments:
service.updateMet(
Met [id=10, name=mnTest, definition=mdTest]
);
代码如下:
@Test
public void updateMet() throws Exception {
String cName = "mae";
MetInDTO metDTO = new MetInDTO();
metDTO.setName("mnTest");
metDTO.setDescription("mdTest");
DataTerm dTerm = new DataTerm(10, metDTO.getName(), metDTO.getDescription());
Met met = new Met(dTerm);
Mockito.doNothing().when(service).updateMet(met);
mockMvc.perform(put("/restapi/{cname}/met/{id}", cName, met.getId())
.contentType(contentType).content(convertObjectToByte(metDTO)))
.andExpect(status().isOk());
verify(service, times(1)).updateMet(met);
}
更新:
@Test
public void updateMet() throws Exception {
String cName = "mae";
MetInDTO metDTO = new MetInDTO();
metDTO.setName("mnTest");
metDTO.setDescription("mdTest");
DataTerm dTerm = new DataTerm(10, metDTO.getName(), metDTO.getDescription());
Met met = new Met(dTerm);
final ArgumentCaptor<Met> captor = ArgumentCaptor.forClass(Met.class);
Mockito.doNothing().when(service).updateMet(any(Met.class));
mockMvc.perform(put("/restapi/{cname}/met/{id}", cName, met.getId())
.contentType(contentType).content(convertObjectToByte(metDTO)))
.andExpect(status().isOk());
verify(service).updateMet(captor.capture());
Met captured = captor.getValue();
assertEquals(met.getName(), captured.getName());
assertEquals(met.getDefinition(), captured.getDefinition());
}
您是否覆盖 Met
的 equals()
方法? arg 列表是相同的(在第一个片段中),但它表示您使用的是不同的参数。
由于您无法覆盖 Met
class 的 equals() 方法,您可以选择捕获间谍 service
的输出并检查它是否与您匹配想。你可以这样做:
doNothing().when(service).updateMet(any(Met.class));
final ArgumentCaptor<Met> captor = ArgumentCaptor.forClass(Met.class);
mockMvc.perform(bla, bla);
verify(service).updateMet(captor.capture());
final Met captured = captor.getValue();
// verify captured Met instance here
注意:对于断言,您可能需要使用 assertj.
我正在尝试对 REST 服务进行模拟测试,将数据更新到给定 ID 的数据库。
我试过 Add(POST request) 效果很好。
但是当我尝试 PUT 请求时它给了我一个错误:
Argument(s) are different! Wanted:
service.updateMet(
Met [id=10, name=mnTest, definition=mdTest]
);
-> at org.MetApp.MetTest.updateMet(MetTest.java:175)
Actual invocation has different arguments:
service.updateMet(
Met [id=10, name=mnTest, definition=mdTest]
);
代码如下:
@Test
public void updateMet() throws Exception {
String cName = "mae";
MetInDTO metDTO = new MetInDTO();
metDTO.setName("mnTest");
metDTO.setDescription("mdTest");
DataTerm dTerm = new DataTerm(10, metDTO.getName(), metDTO.getDescription());
Met met = new Met(dTerm);
Mockito.doNothing().when(service).updateMet(met);
mockMvc.perform(put("/restapi/{cname}/met/{id}", cName, met.getId())
.contentType(contentType).content(convertObjectToByte(metDTO)))
.andExpect(status().isOk());
verify(service, times(1)).updateMet(met);
}
更新:
@Test
public void updateMet() throws Exception {
String cName = "mae";
MetInDTO metDTO = new MetInDTO();
metDTO.setName("mnTest");
metDTO.setDescription("mdTest");
DataTerm dTerm = new DataTerm(10, metDTO.getName(), metDTO.getDescription());
Met met = new Met(dTerm);
final ArgumentCaptor<Met> captor = ArgumentCaptor.forClass(Met.class);
Mockito.doNothing().when(service).updateMet(any(Met.class));
mockMvc.perform(put("/restapi/{cname}/met/{id}", cName, met.getId())
.contentType(contentType).content(convertObjectToByte(metDTO)))
.andExpect(status().isOk());
verify(service).updateMet(captor.capture());
Met captured = captor.getValue();
assertEquals(met.getName(), captured.getName());
assertEquals(met.getDefinition(), captured.getDefinition());
}
您是否覆盖 Met
的 equals()
方法? arg 列表是相同的(在第一个片段中),但它表示您使用的是不同的参数。
由于您无法覆盖 Met
class 的 equals() 方法,您可以选择捕获间谍 service
的输出并检查它是否与您匹配想。你可以这样做:
doNothing().when(service).updateMet(any(Met.class));
final ArgumentCaptor<Met> captor = ArgumentCaptor.forClass(Met.class);
mockMvc.perform(bla, bla);
verify(service).updateMet(captor.capture());
final Met captured = captor.getValue();
// verify captured Met instance here
注意:对于断言,您可能需要使用 assertj.