Spring boot пытается подключиться к mongo при добавлении зависимости maven mongo-java-driver - PullRequest
0 голосов
/ 11 октября 2019

Я только что добавил:

    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongo-java-driver</artifactId>
    </dependency>

в мой загрузочный проект Maven Spring. И у меня также есть этот тест:

/*
 * Copyright 2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package hello;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class GreetingControllerTests {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void noParamGreetingShouldReturnDefaultMessage() throws Exception {

        this.mockMvc.perform(get("/greeting")).andDo(print()).andExpect(status().isOk())
                .andExpect(jsonPath("$.content").value("Hello, World!"));
    }

    @Test
    public void paramGreetingShouldReturnTailoredMessage() throws Exception {

        this.mockMvc.perform(get("/greeting").param("name", "Spring Community"))
                .andDo(print()).andExpect(status().isOk())
                .andExpect(jsonPath("$.content").value("Hello, Spring Community!"));
    }

}

По какой-то причине, когда я строю свой проект с mvn clean package, весенняя загрузка теперь пытается подключиться к mongodb:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.7.RELEASE)

2019-10-11 20:36:58.418  INFO 14870 --- [           main] hello.GreetingControllerTests            : Starting GreetingControllerTests on user-ThinkPad-X390 with PID 14870 (started by user in /home/user/repos/frontend-backend/backend)
2019-10-11 20:36:58.423  INFO 14870 --- [           main] hello.GreetingControllerTests            : No active profile set, falling back to default profiles: default
2019-10-11 20:36:59.311  INFO 14870 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-10-11 20:36:59.565  INFO 14870 --- [           main] org.mongodb.driver.cluster               : Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
2019-10-11 20:36:59.591  INFO 14870 --- [localhost:27017] org.mongodb.driver.cluster               : Exception in monitor thread while connecting to server localhost:27017

com.mongodb.MongoSocketOpenException: Exception opening socket
    at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:67) ~[mongo-java-driver-3.8.2.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126) ~[mongo-java-driver-3.8.2.jar:na]
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongo-java-driver-3.8.2.jar:na]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.base/java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:na]
    at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) ~[na:na]

Если я просто удаляюпроверка или зависимости монго для указанного выше соединения монго не инициируется.

Но в приведенном выше тесте нет ссылки на монго, так почему Spring пытается запустить соединение монго?

1 Ответ

3 голосов
/ 11 октября 2019

Если я должен ответить в одном предложении, это потому, что Springboot является мнением. Он попытается подключиться к монго, как только обнаружит зависимость монго в вашем pom через AutoConfiguration классы.

Если вы хотите переопределить поведение по умолчанию и сказать Springboot не делать MongoAutoConfiguration, то вы можете сделать это следующим образом

@SpringBootApplication(exclude=MongoAutoConfiguration.class)
public class YourMainApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
}

или вы можете сделать это с помощью этой строки в файле свойств

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration

Если вы сделаете любое из вышеперечисленного, оно исключит MongoAutoconfiguration из вашего приложения (а не только из ваших тестов). Это означает, что при запуске приложения у вас нет доступа к монго (если это то, что вы хотите).

Поскольку аннотация SpringbootTest загружает весь текст приложения, он ищет этот класс Main Application. Если у вас исключены некоторые автоконфигурации, они будут исключены даже в ваших тестах. Таким образом, у вас не будет проблемы с подключением к mongo.

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

@TestPropertySource(properties=
{"spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration"})
@SpringBootTest
public class GreetingControllerTests {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...