Модульные тесты Junit Spring Boot для бизнес-логики и соединений с БД

В моем весеннем загрузочном приложении у нас есть сервис, контроллер и модель.

Контроллер имеет:

  @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, который проверяет статус.

Я не уверен в направлении, чтобы проверить бизнес-логику сейчас.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что нет «правильного» ответа, но я бы сначала разделил метод getReplyCount, потому что в данный момент его трудно протестировать. Этот метод в настоящее время делает несколько вещей:

  • подготавливает запрос
  • получить данные с помощью подготовленного оператора
  • сопоставляет данные с классом ClicksReply
  • группирует товары по тегам

С гораздо меньшим объемом вы можете гораздо проще тестировать различные сценарии, такие как:

  • допустимые/недопустимые входные параметры
  • построение запроса
  • неудачное выполнение запроса
  • различные проблемы с отображением
  • правильная группировка предметов

Также в тесте API вы можете добавить больше сценариев, таких как ошибка, неверный ввод и т. д.

Что мне лично помогло в прошлом, так это книга о тестировании / tdd в Java, она дала мне гораздо больше информации о том, что следует учитывать при тестировании, потому что есть много подводных камней, особенно при поддержании хорошего набора тестов с течением времени.

Я надеюсь, что это помогло.

привет, вайпу

Другие вопросы по теме