Спасибо GSSwain, который привел меня в правильном направлении, теперь я смог решить мою проблему.Кажется, что оно появляется, только если атрибут @SpringBootTest
webEnviroment
установлен на MOCK
или NONE
.Использование определенного или случайного порта сообщает Spring для загрузки правильного ServletContext.
Существует несколько способов обойти это, если вы не хотите загружать полный контекст для простых тестов.
Решение1
Это то, что нужно большинству людей.Добавьте дополнительную аннотацию @WebAppConfiguration
к вашим тестовым классам, которая говорит Spring, чтобы загрузить соответствующий ServletContext с фиктивной записью атрибута для ServerContainer.
Решение 2
Для моих нужд это было все ещемного раздувать фон, вещи, которые мне не нужны, во многих тестовых случаях.Поэтому я добавил проверку в самом создании Бина и добавил свойство для включения или выключения проверки через application.properties.
В вашем классе WebsocketConfig:
@Autowired
private ServletContext servletContext;
private boolean ignoreNullWsContainer;
@Bean
public ServletServerContainerFactoryBean createWebSocketContainer() {
// Check if null-container is allowed to prevent Exceptions
if (ignoreNullWsContainer) {
// Check if attribute is set in the ServletContext
ServerContainer serverContainer = (ServerContainer) this.servletContext.getAttribute("javax.websocket.server.ServerContainer");
if (serverContainer == null) {
logger.error("Could not initialize Websocket Container in Testcase.");
return null;
}
}
ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
container.setMaxTextMessageBufferSize(MAX_MESSAGE_SIZE);
container.setMaxBinaryMessageBufferSize(MAX_MESSAGE_SIZE);
return container;
}
@Value("${project.ignore-null-websocket-container}")
private void setIgnoreNullWsContainer(String flag) {
this.ignoreNullWsContainer = Boolean.parseBoolean(flag);
}
И в вашемapplication.properties в каталоге ресурсов Test src (по умолчанию dir src / test / resources / application.properties
project.ignoreNullWsContainer = true
Таким образом, если вы не установите это свойство в файле свойств вашей производственной среды, Spring все равно будетпотерпеть неудачу, если что-то не так с ServerContainer.
Это то, что я взял в конце, потому что мне не нужны функции теста Spring, мне нужен был только Spring, чтобы забрать мою конфигурацию источника данных (в файле свойств)и выполнение моих аннотаций @Sql: D
Надеюсь, это также поможет кому-то еще, сэкономить часы поиска, боли и поиска в сети;):)