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

JUnit 5单元测试Get和Post方法

邹举
2023-03-14

我是spring boot和Junit测试的新手。我在测试Rest Api的Get和Post方法时遇到了问题。许多在线教程指导在JUnit测试中使用mockMvc。但是这些对于JUnit 5仍然有效吗?

@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = RegisterRestController.class)
class RegisterRestControllerTest {
  @Autowired
  private MockMvc mockMvc;

  @Autowired
  private ObjectMapper objectMapper;

  @MockBean
  private RegisterUseCase registerUseCase;

  @Test
  void whenValidInput_thenReturns200() throws Exception {
    mockMvc.perform(...);
  }

}

然而,我读到一篇文章说,从SpringBoot 2.1开始,您不需要包含@ExtendWith扩展。由于Junit 5和spring boot都从以前的版本更新了很多变化,所以很难分析在线可用的代码中哪些是正确的。我无法使用MockMvc.perform()。andExpect(状态()。isOk())。

mockMvc.perform(post("/forums/{forumId}/register", 42L)
    .contentType("application/json")
    .param("sendWelcomeMail", "true")
    .content(objectMapper.writeValueAsString(user)))
    .andExpect(status().isOk());

测试 Get 和 post 方法的正确用法是什么。测试 Rest 动词属于单元测试还是集成测试?

还指导我好的来源,以检查Spring Boot的JUnit 5的更新功能(Junit 5文档在我的情况下没有帮助)。

共有1个答案

卓学智
2023-03-14

您可以在单元测试中使用MockMvcRequest Builders。这是一个带有post的示例


@ExtendWith(SpringExtension.class)
@WebMvcTest(RegisterRestController.class)
@AutoConfigureMockMvc(addFilters = false) //for disabling secruity, remove if not needed
class RegisterRestControllerTest {

    @MockBean
    private MyService myService;

    @Autowired
    private ObjectMapper objectMapper;

    @Autowired
    private MockMvc mockMvc;

    @Test
    void someTest() {
        // mock post of new User
        when(myService.createPojo(User.class)))
                .thenAnswer((Answer<User>) 
                     invocationOnMock -> invocationOnMock.getArgument(0, User.class));

        // test post request with data
        mockMvc.perform(MockMvcRequestBuilders
                .post("/forums/{forumId}/register", 42L)
                .contentType("application/json")
                .param("sendWelcomeMail", "true")
                .content(objectMapper.writeValueAsString(user)))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.name").value("some name"));
    }

类似地,您可以测试GET、PUT和DELETE。希望这能帮助您测试控制器。

回答单元与联调部分:在这种情况下,您正在测试一个单元,即控制器。处理事务的服务和所有其他层都被模拟,例如在我的示例代码中使用mockito。

对于集成测试,您不会使用任何模拟。你会有一个真正的数据库,或者至少是一个像h2这样的“假数据库”。

 类似资料:
  • 我正在为一个具有HTTP get、put和post方法模块的应用程序编写django unittests。我一直在引用rest_framework的APITestCase方法来为POST方法编写unittest。 ========================================================================= Traceback(最近调用最后):文

  • 问题内容: 阅读并学习单元测试,尝试理解下面的文章,该文章解释了静态函数调用的困难。 我不清楚这个问题。我一直认为静态函数是在类中舍入实用函数的一种好方法。例如,我经常使用静态函数调用进行初始化,即: //阅读这篇文章后,我现在的目标是… 但是,我为此课程编写的几十个测试是相同的。我什么都没改变,他们仍然都过去了。难道我做错了什么? 该帖子的作者指出: 静态方法的基本问题是它们是过程代码。 我不知

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

  • 我有一个工作环境,包括我不管理的bom和JUnit5测试,除非我从如果我从它们不会被maven surefire插件拾取。我阅读了许多部分,并在一个较小的项目中进行了测试,它的工作和拾取,我不知道该在这篇文章中包含什么,因此您有足够的信息来查看问题所在。此外,如果有人能解释我阅读的导入的幕后内容,JUnit 4和5都需要使用surefire即 与版本 我很感激。 注意到 < li >我的测试都在s

  • 问题内容: 我有以前具有大量方法的类,因此我将此方法的工作细分为“辅助”方法。 这些辅助方法声明为强制执行封装- 但是我想对大型公共方法进行单元测试。是否也可以对辅助方法进行单元测试,好象其中的一个失败,而调用它的公共方法也会失败,这样我们就可以确定为什么失败了? 另外,为了使用模拟对象测试这些对象,我需要将其可见性从私有更改为受保护,这是否可取? 问题答案: 一种方法是省略测试并将其放在同一程序

  • 测试失败,因为为。为什么不以阻塞的方式在ViewModel中运行块? 我知道,如果将其转换为返回对象的方法,则可以通过调用获取对象,或者可以返回并调用。但是,我想通过将我的ViewModel方法保留为函数来实现这一点,有没有办法做到这一点呢?