Я собираюсь взять свой Весенняя сертификация 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? или что, Да, нам это нужно. Потому что мы, очевидно, используем его в некоторых случаях.
'использование Spring' и 'использование SpringRunner' - это не совсем одно и то же
Привет, @Stultuske, вы правы, но поскольку SpringRunner находится в пакете springframework: (org.springframework.test.context.junit4.SpringRunner), я пришел к выводу, что на самом деле мы здесь используем Spring; и тестовый модуль поставляется с пружинным сердечником




Первый абзац, который вы упомянули, является ответом на ваш вопрос, вам не нужен 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");
}
}
Большое спасибо за разъяснения!
@strg Нет проблем! Хотя должен сказать, что этот вопрос сертификации довольно расплывчатый.
На самом деле мы можем использовать некоторые части пакета Spring-Test в модульном тесте. В частности, для этой цели Spring Framework предоставляется подпакет насмехаться. Выдержка из документации: Однако для определенных сценариев модульного тестирования Spring Framework предоставляет фиктивные объекты и классы поддержки тестирования. Но, разумеется, ваш модульный тест не должен зависеть от этих классов / использовать их ...
Это несколько субъективно, но когда тесты контроллеров должны использовать Spring? Приведенный выше пример представляет собой очень строгий модульный тест, но в некоторых сценариях я использовал макет mvc, настроенный вручную, в сочетании с mockito, чтобы таким образом имитировать другие используемые классы и модульные контроллеры отдыха. Он не использует spring и не является «традиционным» модульным тестом, как описано выше, но он тестирует контроллер в несколько смоделированной веб-среде, то есть ближе к его реальному использованию, чем указано выше, позволяет избежать накладных расходов с использованием Spring в модуле. test и все еще тестирует отдельно от других классов
@ jbailie1991 Во многом это зависит от того, что вы хотите протестировать. Вас интересуют только вызовы, выполняемые внутри контроллера, или вы также хотите протестировать отображение контроллера? Если вы хотите протестировать первый, достаточно будет простого модульного теста с фреймворком для фиксации. Если вам нужно последнее, вы можете написать тест, используя mock mvc.
Я успешно тестировал поведение своих контроллеров, вообще не задействуя Spring. Я также успешно протестировал аннотацию контроллера, попросив Spring издеваться над контроллером и вызвав mockMvc.
@Downvoter: вам не нужно голосовать против только потому, что я пытаюсь лучше понять концепцию. :)