gpt4 book ai didi

java - 用于业务逻辑和数据库连接的 Junit Spring Boot 单元测试

转载 作者:行者123 更新时间:2023-12-02 09:50:33 24 4
gpt4 key购买 nike

在我的 Spring Boot 应用程序中,我们有服务、 Controller 和模型。

Controller 具有:

  @RequestMapping(value = "/v1/abc/def", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ServiceResponse<Map<String, List<ClicksReply>>> getAbcCall(@RequestParam(value = "Id") String Id,
@RequestParam(value = "Tag") List<String> Tag) throws SQLException {
Map<String, List<ClicksReply>> clicks = mysqlService.getReplyCount(pageId, notificationTag);
return new ServiceResponse<>(HttpStatus.OK, clicks);
}

mysqlService.getReplyCount 看起来像这样:

    public Map<String, List<ClicksReply>> getReplyCount(String pageId, List<String> notificationTag) {
String notificationIds = getStringForInQuery(notificationTag);
try (PreparedStatement preparedStatement = connection.prepareStatement(String.format(GET_CLICK_COUNT, notificationIds))) {
Map<String, List<Clicks
Reply>> mapNotifsButtonCount = new HashMap<>();
preparedStatement.setString(1, pageId);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {

ClicksReply reply = new ClicksReply();

Integer buttonId = resultSet.getInt(2);
Integer clickCount = resultSet.getInt(3);

reply.setButtonId(buttonId);
reply.setCount(clickCount);
String tag = resultSet.getString(1);


if (!mapNotifsButtonCount.containsKey(tag)) {
List<ClicksReply> clicksReplies = new LinkedList<>();
mapNotifsButtonCount.put(tag, clicksReplies);
}
List<ClicksReply> existinglist = mapNotifsButtonCount.get(tag);
existinglist.add(reply);
}
resultSet.close();
preparedStatement.close();
return mapNotifsButtonCount;
} catch (SQLException exception) {
return null;
}
}

我是 Java Stack 的新手,在遵循一些基础知识后,我尝试编写单元测试,这就是我所取得的进展:

@RunWith(SpringRunner.class)
@WebMvcTest(value = StatsController.class, secure = false)
public class StatsTest {
@Autowired
private MockMvc mockMvc;

@MockBean
private MysqlService mysqlService;

@Test
public void getReplyCount() throws Exception {
Map<String, List<ClicksReply>> mapClicksReply = new HashMap();
Mockito.when(
mysqlService.getQuickReplyCount(
Mockito.any(String.class), Mockito.anyListOf(String.class)
)
).thenReturn(mapClicksQuickReply);


RequestBuilder requestBuilder = MockMvcRequestBuilders.get(
"/v1/abc/def")
.param("Id", Mockito.anyString())
.param("Tag", Mockito.anyString())
.accept(
MediaType.APPLICATION_JSON);

mockMvc.perform(requestBuilder).
andExpect(jsonPath("$.httpStatusCode").value(200))
.andExpect(jsonPath("$.errorMessage").value(IsNull.nullValue()))
.andDo(print());


}

}

下一步应该如何实际“单元测试”业务逻辑、数据库连接和查询结果?到目前为止我所做的更像是检查状态的高级 API 测试。

我不知道方向,现在检查一下业务逻辑。

最佳答案

我认为没有“正确”的答案,但我会首先拆分 getReplyCount 方法,因为目前很难测试。此方法当前执行多项操作:

  • 准备查询
  • 使用准备好的语句获取数据
  • 将数据映射到 ClicksReply
  • 按标签对项目进行分组

通过更小的范围,您可以更轻松地测试不同的场景,例如:

  • 有效/无效的输入参数
  • 构建查询
  • 查询执行失败
  • 映射的不同问题
  • 正确的项目分组

此外,在 API 测试中,您可以添加更多场景,例如错误、无效输入等。

我个人过去帮助过一本关于 Java 中的测试/tdd 的书,它给了我更多关于测试时需要考虑的内容,因为存在很多陷阱,尤其是随着时间的推移维护良好的测试套件。

我希望这有帮助。

问候,维普

关于java - 用于业务逻辑和数据库连接的 Junit Spring Boot 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56348816/

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