当前位置: 首页 > 知识库问答 >
问题:

解析端口已在Spring boot测试定义的端口中使用

督冠玉
2023-03-14

我有一个Spring启动应用程序,它启动并执行一个类,该类侦听ApplicationReady事件以调用外部服务来获取一些数据,然后使用这些数据将一些规则推送到类路径中执行。对于本地测试,我们模拟了应用程序中的外部服务,该服务在应用程序启动期间运行良好。

问题是在测试应用程序时,通过使用 Spring 启动测试注释和嵌入式 jetty 容器在以下位置运行它:

  • 随机端口
  • 定义的端口

对于RANDOM端口,在应用程序启动时,它从定义端口的属性文件中获取模拟服务的url,并且不知道嵌入容器在哪里运行,因为它是随机获取的,因此无法给出响应。

对于 DEFINED PORT,对于第一个测试用例文件,它成功运行,但是在拾取下一个文件时,它失败,表示端口已在使用中。

测试用例在多个文件中进行逻辑分区,并且需要在容器开始加载规则之前调用外部服务。

在使用定义的端口的情况下,如何在测试文件之间共享嵌入式容器,或者重构我的应用程序代码以在测试用例执行期间启动时获取随机端口。

任何帮助将不胜感激。

应用程序启动代码:

@Component
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent> {

@Autowired
private SomeService someService;

@Override
public void onApplicationEvent(ApplicationReadyEvent arg0) {

    try {
        someService.callExternalServiceAndLoadData();
    }
    catch (Execption e) {}
    }
 }

测试代码注释:Test1

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@TestPropertySource("classpath:test-application.properties")
public class Test1 {

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void tc1() throws IOException {.....}

测试代码注释:Test2

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@TestPropertySource("classpath:test-application.properties")
public class Test2 {

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void tc1() throws IOException {.....}

共有3个答案

子车轶
2023-03-14

在application.properties

server.port=0

将在随机端口中运行应用程序

轩辕瑞
2023-03-14

我遇到了同样的问题。我知道这个问题有点老了,但这可能会有所帮助:

使用 @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) 的测试还可以使用 @LocalServerPort 注释将实际端口注入到字段中,如以下示例所示:

来源:https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-user-a-random-unassigned-http-port

给出的代码示例如下:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
public class MyWebIntegrationTests {

    @Autowired
    ServletWebServerApplicationContext server;

    @LocalServerPort
    int port;

    // ...

}
江礼骞
2023-03-14

如果您坚持在多个测试中使用同一个端口,您可以通过用@DirtiesContext注释您的testclass来防止spring缓存进一步测试的上下文

对于您的情况:

@RunWith(SpringRunner.class)
@DirtiesContext
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@TestPropertySource("classpath:test-application.properties")

这是安迪·威尔金森在这次讨论中的回答

这是按照设计工作的。默认情况下,Spring Framework的测试框架将缓存上下文,以备多个测试类重用。您有两个不同配置的测试(由于@TestPropertySource ),所以它们将使用不同的应用程序上下文。第一个测试的上下文将被缓存,并在第二个测试运行时保持打开。两个测试都被配置为对Tomcat的连接器使用同一个端口。因此,当运行第二个测试时,由于与第一个测试中的连接器发生端口冲突,上下文无法启动。您有几个选择:

  1. 使用RANDOM_PORT
  2. 从Test2中删除@TestPropertySource,以便上下文具有相同的配置,并且第一个测试中的上下文可以重新用于第二个测试
  3. 使用@DirtiesContext,以便不缓存上下文
 类似资料:
  • Spring靴:1.4.0.M1 我有一个IIS在端口80上运行,但是我已经通过STS配置属性将Sever.port更改为8090。STS屏幕快照 为什么STS embedded tomcat在更改后仍使用端口80?有点迷惑。

  • 问题内容: 有没有办法在kubernetes服务YAML定义中指定自定义 NodePort 端口?我需要能够在配置文件中显式定义端口。 问题答案: 您可以在部署中设置类型。请注意,为您的API服务器配置了一个选项(默认为)。您还可以通过设置对象下的属性来专门指定该范围内的端口,否则系统将为您选择该范围内的端口。 因此,带有指定的示例如下所示: 有关NodePort的更多信息,请参阅此文档。有关配置

  • 问题内容: 有什么方法可以测试特定端口是否已打开并使用PHP正确转发?具体来说,我该如何使用套接字通过给定端口连接到给定用户? 一个示例在WhatsMyIP.org/ports的“自定义端口测试”部分中。 问题答案: 我不确定“正确转发”是什么意思,但希望这个例子能解决这个问题: 输出: 有关 端口号的完整列表,请参见http://www.iana.org/assignments/port- nu

  • 端口80正在使用中,所以我想知道如何才能杀死在端口80上运行的进程。

  • 我正在用Apache Camel路由为Spring Boot应用程序创建一些单元测试,使用Spock作为测试框架,我需要模拟来自另一个应用程序的响应。我为此制作了一个模拟控制器,但我需要将测试正在运行的端口注入一个属性。有没有方法获得测试正在运行的端口? 我试过 另外,是否有方法在文件中注入该随机端口?理想情况下,我需要在文件中执行以下操作: 其中端口是运行测试的随机端口。

  • 我需要连接到MongoDB通过SSH隧道和JSch端口转发抛出一个错误: 无法绑定本地端口127.0.0.1:27017 我必须通过SSH隧道连接到MongoDB。我在stackoverflow上找到了代码,它解决了我的问题。但几周后,同样的代码停止了工作。我无法确定原因。此外,使用我在Java代码中使用的相同凭据,我还尝试使用SSH-L命令通过CMD连接到相同的凭据,并且工作正常。我还可以使用N