【问题标题】:Run spring boot integration test using maven test but the embeded tomcat is not started使用maven测试运行spring boot集成测试但是嵌入式tomcat没有启动
【发布时间】:2014-12-12 20:34:25
【问题描述】:

我为我的 Spring Boot 应用程序编写了一个集成测试,它显示为以下代码。它在 Eclipse IDE 中运行良好,作为 Junit 测试运行,嵌入的 tomcat 会自动启动和关闭。但是当我使用 maven install 运行它时,它失败了,因为嵌入的 tomcat 没有启动。我是否需要在 Maven 中进行更多配置?怎么做?

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestCoreConfig.class)
@WebAppConfiguration
@IntegrationTest
public class UserRegistrationTest {

@Autowired
private Receiver receiver;


@Test
public void shouldRegisterUser() {
    //Given
    String email = System.currentTimeMillis() + "-a-foo@bar.com";

    //When
    ResponseEntity<UserInfo> entity = registerUser(email);

    //Then
    assertEquals(HttpStatus.OK, entity.getStatusCode());

    UserInfo registeredUser = entity.getBody();
    System.out.println ("The registered user ID is " + registeredUser.getUserId());

    String receivedMessages = receiver.getMessages().toString();
    assertTrue(receivedMessages + " expected to contain " + email,   receivedMessages.indexOf(email) != -1);
}

private ResponseEntity<UserInfo> registerUser(String email) {
    String password = "secret";
    UserInfo userInfo = new UserInfo(email, password);

    RestTemplate restTemplate = new RestTemplate();
    return restTemplate.postForEntity("http://localhost:8080/users/registration", userInfo,  UserInfo.class);
}
}

http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0

<groupId>com.wangjun</groupId>
<artifactId>userRegistration-microservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>userRegistration-microservice</name>
<description>UserRegistration microservice</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.1.6.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
     <dependency>
        <groupId>org.springframework.hateoas</groupId>
        <artifactId>spring-hateoas</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.jayway.jsonpath</groupId>
        <artifactId>json-path</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <start-class>com.wangjun.microservices.userregistration.Application</start-class>
    <java.version>1.7</java.version>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

sshouldRegisterUser(com.wangjun.microservices.userregistration.rest.functional.UserRegistrationTest) Time elapsed: 1.031  sec  <<< ERROR! org.springframework.web.client.ResourceAccessException: I/O error on POST request for     :Connection refused: connect; nested exception is java.net.ConnectException: Connection refused: connect
        at java.net.DualStackPlainSocketImpl.connect0(Native Method)
        at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:579)
        at java.net.Socket.connect(Socket.java:528)
        at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
        at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
        at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
        at sun.net.www.http.HttpClient.<init>(HttpClient.java:211)
        at sun.net.www.http.HttpClient.New(HttpClient.java:308)
        at sun.net.www.http.HttpClient.New(HttpClient.java:326)
        at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:996)
        at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:932)
        at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:850)
        at org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpReq uest.java:78)
        at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHtt pRequest.java:48)
        at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:52)
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:551)
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:512)
        at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:363)
        at com.wangjun.microservices.userregistration.rest.functional.UserRegistrationTest.registerUser(UserRegistration Test.java:91)
        at com.wangjun.microservices.userregistration.rest.functional.UserRegistrationTest.shouldRegisterUser(UserRegistrationTest.java:37)

【问题讨论】:

  • 看起来 Tomcat 在运行时可能不在类路径中,并带有 maven 测试。知道为什么吗?你有没有给他们什么特殊待遇?
  • 这里复制maven文件。我是 Spring Boot 的初学者。我应该在 maven 文件中配置嵌入式 tomcat 服务器吗?怎么做?我的机器上还没有安装tomcat。如果使用gradle,似乎没有配置tomcat,知道吗?谢谢。
  • 看起来不错。也许你有港口冲突?是否有任何东西与您的应用在同一端口上运行(默认为 8080)?
  • 最近被别的东西屏蔽了,抱歉回复晚了。它不应该是端口冲突。我检查了没有使用 8080。当我首先运行“mvn spring-boot:run”,然后运行“mvn install”时,一切正常,测试用例可以通过。看来我必须为spring boot集成测试配置maven?
  • 什么意思?当它失败时你是如何运行测试的? (不,maven 配置没有什么特别之处 - 它只是设置类路径。)

标签: spring spring-boot


【解决方案1】:

扫描端口,将服务器端口设置为找到的空闲端口

@IntegrationTest("server.port:0")

发现端口号

@Value("${local.server.port}")
int port;

将端口添加到网址

restTemplate.postForEntity("http://localhost:"+port+"/users/registration"...

【讨论】:

  • 这应该被标记为正确答案。非常适合我。谢谢@Miodigy
  • 应该标记为正确答案。这对我有用。
【解决方案2】:

Spring 2.0 更新。

我的 Tomcat 在运行应用程序时启动良好,但在我的测试中没有启动。 @Miodigy 的回答对我不起作用,但确实如此:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
class TokenTest {
    @Autowired private SavedSearchesController controller
    @LocalServerPort private int port

重点是:

@SpringBootTest - 确保添加webEnvironment 参数。

@LocalServerPort - 这是 spring 注入随机端口的地方。

没有webEnvironment Tomcat 在我的测试中没有为我启动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 2017-01-22
    • 2020-02-10
    • 2016-01-21
    • 2015-02-10
    • 2013-03-20
    • 2015-07-19
    • 2013-08-29
    相关资源
    最近更新 更多