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 是默认响应代码。

如果您希望在 MyObjectnull 时您的控制器端点为 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);
}