В моем весеннем загрузочном приложении у нас есть сервис, контроллер и модель.
Контроллер имеет:
@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 вы можете добавить больше сценариев, таких как ошибка, неверный ввод и т. д.
Что мне лично помогло в прошлом, так это книга о тестировании / tdd в Java, она дала мне гораздо больше информации о том, что следует учитывать при тестировании, потому что есть много подводных камней, особенно при поддержании хорошего набора тестов с течением времени.
Я надеюсь, что это помогло.
привет, вайпу