2016-11-16 2 views
5

У меня есть несколько классов, аннотированных @RestController, которые я пытаюсь проверить, используя класс MockMvc. Конечные точки отвечают должным образом из веб-приложения, но я получаю следующее сообщение об ошибке при выполнении тестов (от IntelliJ IDEA):Тесты интеграции Spring Boot не могут достичь файла application.properties

java.lang.IllegalArgumentException: Could not resolve placeholder 
'spring.data.rest.base-path' in string value "${spring.data.rest.base-path}/whatever" 

Это, как выглядит файл application.properties как:

spring.data.rest.base-path=/api 
spring.profiles.active=dev 
... 

У меня также есть файл с именем application-dev.properties с дополнительными (разными) свойствами.

Это как прокомментированы тестовые классы:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@WebIntegrationTest // Also tried: @WebAppConfiguration 
@ActiveProfiles("dev") 
// Also tried: @PropertySource("classpath:application.properties") 
// Also tried: @TestPropertySource("classpath:application.properties") 
public class MyRestControllerTest { 
    ... 
} 

С другой стороны, это как контроллеры REST реализуются (где проблематична свойство используется):

@RestController 
@RequestMapping("${spring.data.rest.base-path}/whatever") 
public class MyRestController { 
    ... 
} 

Вот как выглядит основной класс приложения:

@SpringBootApplication(scanBasePackages = {...}) 
@EnableJpaRepositories({...}) 
@EntityScan({...}) 
public class Application { 
    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

И, наконец, это (подмножество) Структура проекта:

my-project 
|_ src 
    |_ java 
    | |_ com.example.x 
    |  |_ controller 
    |  |_ MyRestController.java 
    | 
    |_ test 
    | |_ com.example.x 
    |  |_ controller 
    |  |_ MyRestControllerTest.java 
    | 
    |_ resources 
     |_ application.properties 
     |_ application-dev.properties 

Я нашел несколько решений проблемы по всей сети, но ни один из них, казалось, не работать для меня.

+0

Я не видел, где вы использовали это свойство – Jaiwo99

+0

Извините, что вы правы Я не уточнил, что. Он используется в контроллерах REST для определения базового пути для всех конечных точек. Там свойство прекрасно работает - как я уже упоминал, я могу получить к ним доступ из браузера, как и ожидалось.Это те места, где невозможно прочитать. – DanielM

+0

Кажется, Intellij не распознал/ресурсы как папку ресурсов. Попробуйте @PropertySource ('файл: /path/to/application.properties') –

ответ

0

Ваш application.properties не должен находиться на тестовом пути. Вы должны определить местоположение «Test Resources» для своего проекта в IntelliJ и создать там файл application.properties.

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

+0

Я попытался пометить папку ресурсов как «Test Resources Root» на IntelliJ, но это не помогло. – DanielM

+0

Когда вы смотрите на фактические файлы в тестовом пути, что вы видите? К сожалению, я никогда не использовал IntelliJ, поэтому у меня есть ограниченное понимание. Может быть, http://stackoverflow.com/questions/17039653/resources-not-copied-to-output-path-in-intellij-12-1-4 помогает? –

1

Ответ был, наконец, не связанные с пружинными аннотациями, ни конфигурации IntelliJ, а скорее с MockMvc и, в частности, с классом и методом MockMvcBuilders.standaloneSetup, который используются на тесты setUp. Это не будет использовать контекст приложения, поэтому он не сможет правильно читать свойства, зависящие от него.

После изменения его MockMvcBuilders.webAppContextSetup, который (из документации)

выпуска [с] экземпляра MockMvc, используя данный, полностью инициализирован (т.е. обновляется) WebApplicationContext.

все работает нормально. Для тестов интеграции имеет смысл использовать это, не так ли?

Спасибо всем за ваше время и силы. Извините за отсутствие указанного метода setUp, но я не думал, что проблема могла быть вызвана там.

Смежные вопросы