gpt4 book ai didi

java - 在 Spring-Rest 中编写行为 JUnit 测试有什么意义?

转载 作者:行者123 更新时间:2023-11-30 10:24:07 24 4
gpt4 key购买 nike

我是 JUnit mockito 的新手,我为我的 Spring rest 资源编写了这个测试函数。

@Test
public void getAllMessageHappyTest() throws Exception {
List<Message> messageList = new ArrayList<>();
messageList.add(new Message(1,"Hello"));
messageList.add(new Message(5,"Hello world"));
messageList.add(new Message(3,"Hello World, G!"));

when(messageService.getAllMessages()).thenReturn(messageList);
RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/messages/").accept(MediaType.APPLICATION_JSON);
MvcResult mvcResult = mockMvc.perform(requestBuilder).andReturn();

String expected = ""; // expected
JSONAssert.assertEquals(expected,mvcResult.toString(),false);
}

在上面的场景中,我有 when(messageService.getAllMessages()).thenReturn(messageList); 返回由我编写的 messageList (或由团队成员),我正在将返回的 JSONString expected 进行比较,后者也将由我(或由相同的团队成员)。所以这两件事都是同一个人写的,那么进行这种测试有什么意义。

最佳答案

如果我正确理解了这个问题,那么问题就是这个;因为编写测试的人也硬编码(以 JSON 字符串的形式)期望测试可能是多余的或至少可能值(value)有限。也许您问题的潜台词是,既然编写底层端点的人都会提供期望,那么它就必须通过,如果它的成功是预先注定的,那么它就没有什么值(value)。

但是,无论谁编写测试和谁编写被测代码,您上面显示的示例测试都是有值(value)的,因为:

  • 它测试的不仅仅是重新调整的 JSON,它还测试 ...
    • REST 端点映射是正确的,即它公开了一个名为 "/messages/" 的端点,它接受 JSON
    • REST 层使用序列化器生成一些 JSON
  • 继续运行此测试用例将确保即使在您(或您团队的其他成员)不再处理此代码后,此端点的预期行为也将继续得到满足,或者换句话说;它充当回归安全网。
  • 被测代码将来可能会更改,如果是这样,那么此测试用例将提供一个基准,供将来开发时使用。
  • 测试用例为您的代码提供了一种文档形式;不熟悉此代码库的人可以查看测试以了解代码的预期行为方式。

此外,这个测试用例可以扩展到包括对无效路径(例如无效响应、不安全访问尝试等)的测试,从而提高测试覆盖率。

更新 1:回应此评论:

even if someone makes changes in an actual code and now after making actual code is producing a different kind of JSON(say not as required) even then too test case will pass because when then is hardcoded and expected is also hardcoded. So what is the point?

像这样的测试显然没有意义:

String json = "...";

when(foo.getJson()).thenReturn(json);

assertEquals(json, foo.getJson());

Bu 那不是您的测试所做的不是。相反,您的测试断言响应(采用 JSON 形式)与模拟的 messageService.getAllMessages() 返回的响应的序列化形式相匹配。因此,您的测试涵盖了序列化部分以及 Spring MVC 层的各个方面,例如端点-> Controller 映射以及拦截器和过滤器(如果有的话)。

关于java - 在 Spring-Rest 中编写行为 JUnit 测试有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46688111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com