SpringBoot @WebMvcTest и @MockBean не работают должным образом - PullRequest
0 голосов
/ 28 ноября 2018

Кажется, что @WebMvcTest и @MockBean не работают должным образом.Может быть, я что-то упускаю ... У меня есть контроллер с некоторыми зависимостями, который я издеваюсь с @MockBean, но приложение не запускается, потому что не может найти другой компонент, который, я думаю, не требуется в этом случае.

КОНТРОЛЛЕР:

@RestController
public class ExchangeRateStoreController {
    private AddExchangeRate addExchangeRate;
    private AddExchangeRateRequestAdapter addExchangeRateRequestAdapter;
    private GetExchangeRate getExchangeRate;
    private GetExchangeRateRequestAdapter getExchangeRateRequestAdapter;

    @Autowired
    public ExchangeRateStoreController(ExchangeRateRepository exchangeRateRepository, ExchangeRateDateValidator exchangeRateDateValidator, ExchangeRateView exchangeRateView) {
        addExchangeRate = new AddExchangeRate(exchangeRateRepository, exchangeRateDateValidator);
        addExchangeRateRequestAdapter = new AddExchangeRateRequestAdapter();
        getExchangeRate = new GetExchangeRate(exchangeRateView);
        getExchangeRateRequestAdapter = new GetExchangeRateRequestAdapter();
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public void create(@RequestBody AddExchangeRateRequest addExchangeRateRequest) {
        addExchangeRate.execute(addExchangeRateRequestAdapter.toCommand(addExchangeRateRequest));
    }
}

ТЕСТ:

@RunWith(SpringRunner.class)
@WebMvcTest(ExchangeRateStoreController.class)
public class ExchangeRateStoreControllerTest {

    @Autowired
    private MockMvc mvc;  
    @MockBean
    ExchangeRateRepository exchangeRateRepository;
    @MockBean
    ExchangeRateDateValidator exchangeRateDateValidator;
    @MockBean
    ExchangeRateView exchangeRateView;

    @Test
    public void givenValidExchangeRateCommand_whenCreate_thenOK() throws Exception {
        String validRequestBody = "{\"from\":\"EUR\",\"to\":\"USD\",\"amount\":1.2345,\"date\":\"2018-11-19\"}";

        doNothing().when(exchangeRateDateValidator).validate(any());
        doNothing().when(exchangeRateRepository).save(any());

        mvc.perform(post("/").content(validRequestBody).contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isCreated());
    }

ПРИМЕНЕНИЕ:

@SpringBootApplication
@EnableJpaRepositories("com...exchangerate.store.infrastructure.persistence")
@EntityScan("com...exchangerate.store.infrastructure.persistence")
@ComponentScan(basePackages = {"com...exchangerate.store.infrastructure", "com...exchangerate.store.application"} )
public class ExchangeRateStoreApplication {
    public static void main(String[] args) {
        SpringApplication.run(ExchangeRateStoreApplication.class, args);
    }
}

И ошибка, которую я получаю при запуске теста:

Приложение не удалось запустить


Описание:

Для компонента требуется компонент с именем entityManagerFactory, который не найден.

Действие:

Подумайте об определении bean-компонента с именем entityManagerFactory в вашей конфигурации.

Но, как вы можете видеть, entityManagerFactory не является зависимостью контроллера.Итак, почему тест пытается загрузить этот компонент?Я высмеиваю все зависимости контроллера, поэтому думаю, что этого делать не следует.

Ответы [ 2 ]

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

Проблема вызвана использованием @EnableJpaRepositories в главном классе приложения.Помещая его в основной класс, вы указываете, что репозитории JPA должны быть всегда включены, независимо от того, какой конкретный фрагмент функциональности вы хотите протестировать.

Вы можете решить свою проблему, выполнив одно из следующих действий:следующее:

  • Переместить @EnableJpaRepositores и @EntityScan в отдельный класс конфигурации, специфичный для JPA
  • Удалить @EnableJpaRepositories и @EntityScan и полагаться на автоматически настроенные значения по умолчанию.Чтобы это работало, ваши репозитории и сущности должны быть в подпакете пакета вашего основного класса.

Более подробная информация об этом содержится в справочной документации Spring Boot где говорится следующее:

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

В этом конкретном случае настройка конфигурации, относящаяся к конкретной области, составляет @EnableJpaRepositories.

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

Здравствуйте, в этом посте есть отличная ссылка: EntityManagerFactory не найден в SpringBoot

Вы можете проверить интеграцию jpa с весенней загрузкой и получить несколько полезных советов по настройке среды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...