我正在尝试使用Spring学习集成测试。所以我正在学习本教程:
http://www.lucassaldanha.com/unit-and-integration-tests-in-spring-boot/
我很喜欢这样的测试类:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class GreetingControllerTest {
@Test
public void helloTest(){
TestRestTemplate restTemplate = new TestRestTemplate();
Hello hello = restTemplate.getForObject("http://localhost:8080/hello", Hello.class);
Assert.assertEquals(hello.getMessage(), "ola!");
}
}
但是当我 mvn install 时,我收到此错误:
“http://localhost:8080/hello”的GET请求上的I / O错误:连接被拒绝;嵌套异常是java.net.ConnectException:连接被拒绝
那么......我做错了什么?我需要做些什么来让我的测试工作?
注意:如果我运行 mvn spring-boot:run ,项目工作正常,我使用任何浏览器请求终点。
答案 0 :(得分:4)
这是因为您的测试类中包含以下属性:
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
根据spring documentation,它将应用程序绑定到随机端口。因此,在发送请求时,应用程序可能无法在port
8080上运行,因此您会收到连接拒绝错误。
如果要在特定端口上运行应用程序,则需要删除webEnvironment
属性并使用以下内容注释您的类:
@IntegrationTest("server.port=8080")
另一种方法是获取端口并将其添加到url中,下面是获取端口的代码段:
@Autowired
Environment environment;
String port = environment.getProperty("local.server.port");
答案 1 :(得分:2)
如果愿意,您可以将随机端口值自动连接到测试类中的字段:
@LocalServerPort
int port;
但是您可以自动连接restTemplate,并且应该能够将其与相对URI一起使用,而无需知道端口号:
@Autowired
private TestRestTemplate restTemplate;
@Test
public void helloTest(){
Hello hello = restTemplate.getForObject("/hello", Hello.class);
Assert.assertEquals(hello.getMessage(), "ola!");
}