Используется ли Spring Framework в модульном тесте?

Я собираюсь взять свой Весенняя сертификация v5.0 и, похоже, возникает вопрос: Вы используете Spring в модульном тесте?Ссылка на вопросы руководства по экзамену.

Из Справочное руководство Spring я знаю это:

The POJOs that make up your application should be testable in JUnit or TestNG tests, with objects simply instantiated using the new operator, without Spring or any other container.

Из своего исследования я также могу сказать, что мы используем Spring только при тестировании контроллеров (как показано ниже), репозиториев или при создании интеграционных тестов и, возможно, в некоторых других случаях. В этих случаях нам понадобится TestContext, который является частью пакета org.springframework. *.

@RunWith(SpringRunner.class)

@WebMvcTest(HelloWorldController.class)

Итак, правильный ответ на этот вопрос: Нет, мы не используем Spring? или что, Да, нам это нужно. Потому что мы, очевидно, используем его в некоторых случаях.

@Downvoter: вам не нужно голосовать против только потому, что я пытаюсь лучше понять концепцию. :)

Kejsi Struga 15.05.2018 11:39

'использование Spring' и 'использование SpringRunner' - это не совсем одно и то же

Stultuske 15.05.2018 12:10

Привет, @Stultuske, вы правы, но поскольку SpringRunner находится в пакете springframework: (org.springframework.test.context.junit4.SpringRunner), я пришел к выводу, что на самом деле мы здесь используем Spring; и тестовый модуль поставляется с пружинным сердечником

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

Ответы 2

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

Первый абзац, который вы упомянули, является ответом на ваш вопрос, вам не нужен Spring для написания модульных тестов для написанных вами классов, даже если они являются Spring beans.

Другие случаи, о которых вы упомянули, на самом деле не являются модульными тестами. При тестировании репозитория с использованием SpringRunner и фиктивной базы данных вы больше не пишете модульный тест, а пишете интеграционный тест. То же самое касается написания тестов для вашего контроллера с использованием MockMvc. В обоих случаях вы тестируете интеграцию между фреймворком Spring (Spring MVC или Spring Data) с вашим кодом (и базой данных).

Однако вы можете писать модульные тесты для своего контроллера, но в этом случае вы бы предпочли сделать что-то вроде этого:

@Controller
public class HelloWorldController {
    @RequestMapping("/hello")
    public ModelAndView getHello() {
        return new ModelAndView("hello", "title", "hello world");
    }
}

public class HelloWorldControllerTest {
    private HelloWorldController controller;

    @Before
    public void setUp() {
        controller = new HelloWorldController();
    }

    @Test
    public void getHelloShouldUseHelloView() {
       assertThat(controller.getHello().getViewName()).isEqualTo("hello");
    }

    @Test
    public void getHelloShouldAddATitleModel() {
        assertThat(controller.getHello().getModel()).containsEntry("title", "Hello world");
    }
}

Большое спасибо за разъяснения!

Kejsi Struga 15.05.2018 16:25

@strg Нет проблем! Хотя должен сказать, что этот вопрос сертификации довольно расплывчатый.

g00glen00b 16.05.2018 09:17

На самом деле мы можем использовать некоторые части пакета Spring-Test в модульном тесте. В частности, для этой цели Spring Framework предоставляется подпакет насмехаться. Выдержка из документации: Однако для определенных сценариев модульного тестирования Spring Framework предоставляет фиктивные объекты и классы поддержки тестирования. Но, разумеется, ваш модульный тест не должен зависеть от этих классов / использовать их ...

Laplas 31.12.2018 08:20

Это несколько субъективно, но когда тесты контроллеров должны использовать Spring? Приведенный выше пример представляет собой очень строгий модульный тест, но в некоторых сценариях я использовал макет mvc, настроенный вручную, в сочетании с mockito, чтобы таким образом имитировать другие используемые классы и модульные контроллеры отдыха. Он не использует spring и не является «традиционным» модульным тестом, как описано выше, но он тестирует контроллер в несколько смоделированной веб-среде, то есть ближе к его реальному использованию, чем указано выше, позволяет избежать накладных расходов с использованием Spring в модуле. test и все еще тестирует отдельно от других классов

jbailie1991 20.01.2019 16:07

@ jbailie1991 Во многом это зависит от того, что вы хотите протестировать. Вас интересуют только вызовы, выполняемые внутри контроллера, или вы также хотите протестировать отображение контроллера? Если вы хотите протестировать первый, достаточно будет простого модульного теста с фреймворком для фиксации. Если вам нужно последнее, вы можете написать тест, используя mock mvc.

g00glen00b 25.01.2019 14:23

Spring - это каркас. Фреймворк вызывает вас, поэтому по определению использование spring с вашим контроллером является точкой интеграции и не входит в модульный тест.

Я успешно тестировал поведение своих контроллеров, вообще не задействуя Spring. Я также успешно протестировал аннотацию контроллера, попросив Spring издеваться над контроллером и вызвав mockMvc.

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