MockMvc 始终测试 returns 获取请求的状态代码 200
MockMvc tests always returns status code 200 for get requests
我对 spring boot 很陌生,只用了几天,所以我对这个项目(不是我自己的)也很困惑。我应该用 MockMvc 为其余控制器编写测试,但是每次使用 MockMvc 进行测试时,只有 returns 状态代码 200,尽管它应该是 404。
这是其中一项测试:
@WebMvcTest(ObjectController.class)
@SpringJUnitConfig(TestConfig.class)
public class MvcTest {
@Autowired
MockMvc mockMvc;
@Test
public void shouldReturn404() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/obj/123"))
.andExpect(MockMvcResultMatchers.status().is(HttpStatus.NOT_FOUND.value()));
}
}
这是我要测试的休息控制器。
@RestController
@RequestMapping("obj")
public class ObjectController {
@Autowired
MyClass myClass;
@GetMapping()
public List<MyObject> findAll() {
List<MyObject> objList;
objList = myClass.getObjects();
return objList;
}
@GetMapping("/{id}")
public MyObject findById(@PathVariable String id) {
for (MyObject obj : myClass.getObjects()) {
if (obj.getId().equals(id))
return obj;
}
return null;
}
}
然后就是这个class:
public class MyClass {
private List<MyObject> objList = new ArrayList<MyObject>();
public MyObject addObject(MyObject obj) {
objList.add(obj);
return obj;
}
public void setObjects(List<MyObject> objList) {
this.objList = objList;
}
public synchronized List<MyObject> getObjects() {
return objList;
}
}
有一个属于 class 的 xml 文件,看起来像这样,可以在资源文件夹中找到:
<?xml version='1.0' encoding='ISO-8859-1'?>
<beans xmlns='http://www.springframework.org/schema/beans'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns:context='http://www.springframework.org/schema/context'
xsi:schemaLocation='http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd'>
<bean id='MyClass' class='it.is.some.path.MyClass'>
<property name='objList'>
<list>
<ref bean='[R01] Object1' />
</list>
</property>
</bean>
</beans>
引用的 bean 也可以在资源下的单独文件中找到,在名为 'objList' 的子文件夹中,如下所示:
<?xml version='1.0' encoding='ISO-8859-1'?>
<beans xmlns='http://www.springframework.org/schema/beans'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns:context='http://www.springframework.org/schema/context'
xsi:schemaLocation='http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd'>
<bean id='[R01] Object1' class='this.is.some.path.MyObject'>
<property name='id' value='123' />
</bean>
</beans>
myclass.xml
以及包含所有 xml 个对象的文件夹是通过应用程序 class 中的 @ImportResource
导入的。
然后是
public class MyObject {
public String id = RandomStringUtils.randomAlphanumeric(5);
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
对于冗长的解释,我深表歉意,但我现在已经花了两天时间试图弄清楚如何获得 MockMvc 运行,我觉得我完全被困住了。如果有人能提供帮助,我将非常非常感激。
我假设 200 是正确的响应,因为您有 /obj/{id}
的映射,其中 {id}
是任何路径变量的占位符,例如 /obj/123
中的 123
。
即使您的控制器 returns null
从代码的角度来看,Spring 也不会自动将其映射到 404
not found if this is what you会期待。
因此您可以从字面上尝试使用每个路径变量,您将始终获得 HTTP 200,因为没有任何异常并且 DisptacherServlet
可以将 HTTP 请求正确路由到控制器映射。如果您未指定任何内容,则 HTTP 200 是默认响应代码。
如果您希望在 MyObject
为 null
时您的控制器端点为 return 404,则必须对此更加明确,例如:
@GetMapping("/{id}")
public ResponseEntity<MyObject> findById(@PathVariable String id) {
for (MyObject obj : myClass.getObjects()) {
if (obj.getId().equals(id))
return ResponseEntity.ok(obj);
}
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
}
我对 spring boot 很陌生,只用了几天,所以我对这个项目(不是我自己的)也很困惑。我应该用 MockMvc 为其余控制器编写测试,但是每次使用 MockMvc 进行测试时,只有 returns 状态代码 200,尽管它应该是 404。
这是其中一项测试:
@WebMvcTest(ObjectController.class)
@SpringJUnitConfig(TestConfig.class)
public class MvcTest {
@Autowired
MockMvc mockMvc;
@Test
public void shouldReturn404() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/obj/123"))
.andExpect(MockMvcResultMatchers.status().is(HttpStatus.NOT_FOUND.value()));
}
}
这是我要测试的休息控制器。
@RestController
@RequestMapping("obj")
public class ObjectController {
@Autowired
MyClass myClass;
@GetMapping()
public List<MyObject> findAll() {
List<MyObject> objList;
objList = myClass.getObjects();
return objList;
}
@GetMapping("/{id}")
public MyObject findById(@PathVariable String id) {
for (MyObject obj : myClass.getObjects()) {
if (obj.getId().equals(id))
return obj;
}
return null;
}
}
然后就是这个class:
public class MyClass {
private List<MyObject> objList = new ArrayList<MyObject>();
public MyObject addObject(MyObject obj) {
objList.add(obj);
return obj;
}
public void setObjects(List<MyObject> objList) {
this.objList = objList;
}
public synchronized List<MyObject> getObjects() {
return objList;
}
}
有一个属于 class 的 xml 文件,看起来像这样,可以在资源文件夹中找到:
<?xml version='1.0' encoding='ISO-8859-1'?>
<beans xmlns='http://www.springframework.org/schema/beans'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns:context='http://www.springframework.org/schema/context'
xsi:schemaLocation='http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd'>
<bean id='MyClass' class='it.is.some.path.MyClass'>
<property name='objList'>
<list>
<ref bean='[R01] Object1' />
</list>
</property>
</bean>
</beans>
引用的 bean 也可以在资源下的单独文件中找到,在名为 'objList' 的子文件夹中,如下所示:
<?xml version='1.0' encoding='ISO-8859-1'?>
<beans xmlns='http://www.springframework.org/schema/beans'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns:context='http://www.springframework.org/schema/context'
xsi:schemaLocation='http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd'>
<bean id='[R01] Object1' class='this.is.some.path.MyObject'>
<property name='id' value='123' />
</bean>
</beans>
myclass.xml
以及包含所有 xml 个对象的文件夹是通过应用程序 class 中的 @ImportResource
导入的。
然后是
public class MyObject {
public String id = RandomStringUtils.randomAlphanumeric(5);
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
对于冗长的解释,我深表歉意,但我现在已经花了两天时间试图弄清楚如何获得 MockMvc 运行,我觉得我完全被困住了。如果有人能提供帮助,我将非常非常感激。
我假设 200 是正确的响应,因为您有 /obj/{id}
的映射,其中 {id}
是任何路径变量的占位符,例如 /obj/123
中的 123
。
即使您的控制器 returns null
从代码的角度来看,Spring 也不会自动将其映射到 404
not found if this is what you会期待。
因此您可以从字面上尝试使用每个路径变量,您将始终获得 HTTP 200,因为没有任何异常并且 DisptacherServlet
可以将 HTTP 请求正确路由到控制器映射。如果您未指定任何内容,则 HTTP 200 是默认响应代码。
如果您希望在 MyObject
为 null
时您的控制器端点为 return 404,则必须对此更加明确,例如:
@GetMapping("/{id}")
public ResponseEntity<MyObject> findById(@PathVariable String id) {
for (MyObject obj : myClass.getObjects()) {
if (obj.getId().equals(id))
return ResponseEntity.ok(obj);
}
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
}