Java 在spring boot应用程序中,如何在每次JUnit测试之后释放端口号?

Java 在spring boot应用程序中,如何在每次JUnit测试之后释放端口号?,java,unit-testing,spring-boot,junit,Java,Unit Testing,Spring Boot,Junit,我有一个用spring boot编写的JUnit测试类,它包含3个单元测试: @RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) @ContextConfiguration @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD) public class AppclaitionTest { @BeforeClass

我有一个用spring boot编写的JUnit测试类,它包含3个单元测试:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@ContextConfiguration
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class AppclaitionTest {

    @BeforeClass
    public static void initialize(){
        System.out.println(">>>>>>>Intialization Part!");
    }

    @Test
    public void test1(){
        System.out.println(">>>>>>>Appcliation Test Started! - Test 1");
        Application.main(new String[]{});
        System.out.println(">>>>>>>Appcliation Test Ended! - Test 1");
    }

    @Test
    public void test2(){
        System.out.println(">>>>>>>Appcliation Test Started! - Test 2");
        Application.main(new String[]{});
        System.out.println(">>>>>>>Appcliation Test Ended! - Test 2");
    }

    @Test
    public void test3(){
        System.out.println(">>>>>>>Appcliation Test Started! - Test 3");
        Application.main(new String[]{});
        System.out.println(">>>>>>>Appcliation Test Ended! - Test 3");
    }

    @AfterClass
    public static void destory(){
        System.out.println(">>>>>>>Destroy Part!");
    }
}
如果在第一次测试后运行,我将得到以下异常:

java.net.BindException: Address already in use: bind
虽然应用程序上下文已释放,但它没有释放端口号,因此我得到了上述异常


有什么方法可以在每个单元测试之前关闭端口号吗?

使用
@After
@before
来处理每个单元测试的前后调用。

您可能会遇到这个问题,因为有多个springboot测试,您可能正在使用类似surefire的东西来执行测试类平行

使用SpringBoot,您可以在每个junit类中随机化端口,定义如下。但请注意,这将是在类级别,而不是在测试级别

但我并不认为在方法层面上有必要。Springboot测试很慢,所以我建议不要这样做


> Spring BooTestType(类=Apvest.class,WebCudio= Spring BooTest.WebEntry.RealthyPurt)

< P> >应考虑使用<代码> Spring Apvest类启动Spring启动应用程序,而不是直接调用<代码>主体(String)[ARG]您的Spring Boot应用程序的方法,该方法不提供终止它的API。

使用
SpringApplication
方式,您可以获得一个
ConfigurableApplicationContext
实例,该实例提供了终止正在运行的应用程序的方法。

例如:

ConfigurableApplicationContext context;

@Before
public void setup{
    SpringApplication springApplication = new SpringApplicationBuilder()           
            .sources(Application.class)
            .build();
    context = springApplication.run();
}

@After
public void tearDown(){
    SpringApplication.exit(context);
}

@Test
 public void test1(){         
    // action
       ...
    // assertion
       ...
 }
但是,您应该谨慎对待这种做法。
启动Spring启动应用程序是一项相对昂贵的操作。
对任何测试方法执行它都会降低测试执行的速度
单元测试应该很快。
在集成计算机上执行的集成测试可能会比较慢。

你也应该考虑这个问题。

我们有没有办法在每个单元测试之后停止Spring Bug应用程序?也许你需要使用<代码> Spring Apple < /Cord>启动和停止你的应用程序。Spring AppultualBu建器以前的版本(1.1.4)不包含构建方法来构建应用程序并启动。因此,我将代码更改为:解决方案1:context=newspringapplicationbuilder(Application.class).web(false.run();解决方案2:SpringApplicationBuilder应用程序=新的SpringApplicationBuilder(Application.class);应用程序源(应用程序类);app.web(假);context=app.run();但在这两种情况下,应用程序都没有启动。您可能需要使用{@beforeach}和{@AfterEach},正如下面的回复所示:@Lars,这是可能的。我的答案依赖于JUnit4,而另一个依赖于JUnit5。