Spring Boot Как определить @Components в src / test, чтобы они могли @Autowire в тесты? - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь сделать интеграционные тесты REST API. Я написал несколько классов утилит тестирования для построения тестовых данных, и я хотел бы @Autowire использовать их в моих методах тестирования. При запуске моих тестов @Autowire завершается ошибкой, так как Spring не знает об этих компонентах. Я начал с добавления внутреннего класса @Configuration в свои тесты, но я пытаюсь @Autowire репозитории в эти утилиты, поэтому мне нужна эта цепочка @Autowire для работы. Можно ли это сделать? Как мне это сделать?

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(locations = "classpath:application-it.properties")
public class ContactControllerIT
{
    @Autowired
    private ContactController contactController;   // <---  This autowires as expected

    @Autowired
    private TestContactBuilder contactBuilder;    // <--- This class is defined in src/test and autowired fail w/ no bean found error

Пример проекта: https://github.com/tbbstny/spring-boot-it-study

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Определили, что проблема не в том, чтобы сканировать src / test / java, а скорее в понимании процесса сканирования по умолчанию в Spring Boot.Я добавил свои компоненты построителя данных в другой пакет, чем тот, который аннотирован @SpringBootApplication.По умолчанию Spring выполняет компонентное сканирование этого пакета и всего, что вложено только в этот пакет.Есть два способа исправить мою проблему:

  1. Переместить утилиты построения данных в / под тот же пакет, что и @SpringBootApplication, то есть com.ttt.example.api
  2. Добавьте @ComponentScan в класс Application, чтобы включить пакет, в котором находятся утилиты построителя данных.

    @ComponentScan("com.ttt.example")  // <-- Move up to root package to ensure all my components are scanned
    @SpringBootApplication
    public class Application
    
0 голосов
/ 17 ноября 2018

Если вы хотите протестировать контроллер, вам не нужно использовать его в своих тестах. Вы бы использовали MockMvc

Вот пример:

@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@EnableAutoConfiguration
public class SomeTest {

 @Autowired
 private MockMvc mockMvc;

 @Test
 public void getGeneratedPassword_shouldReturn200Status() throws Exception {
 boolean isGenerated = this.mockMvc.perform(get("/generate/password/1").with(httpBasic(this.username, this.password)))
        .andExpect(authenticated())
        .andExpect(status().isOk())
        .andReturn()
        .getResponse()
        .getContentAsString().isEmpty;

 assertFalse(isGenerated);
  }    
}

Тест будет пройден, поскольку он вернет не пустую строку. Существует также 2 этапа проверки. Если пользователь правильный и если статус HTTP 200.

Будет работать с версией 2.1.0 Spring Boot и выше. Вы также можете добавить свой путь application.properties.

Документация: https://spring.io/guides/gs/testing-web/

Другой способ, который можно использовать в вашем текущем коде, - добавить эту аннотацию:

@SpringBootTest(classes = {ContactController.class, TestContactBuilder.class})
...