2
我想在我的Cucumber-JVM程序中創建一個新線程,當我達到某個BDD步驟時,創建一個新線程。Java程序在線程完成之前退出。我如何讓Cucumber-JVM等待線程退出?
然後,一個線程應該做一些事情,而最初的主線程繼續貫穿黃瓜步驟。
程序不應該退出,直到所有線程都完成。
我遇到的問題是主程序在線程完成之前退出。
這裏發生的事情:
輸出/問題
- 主程序是
RunApiTest
- 的線程類是
ThreadedSteps
。
這是當我運行該程序會發生什麼:
RunApiTest
開始通過所有準備步驟RunApiTest
到達RunApiTest
現在創建「我應該會在5分鐘之內收到一封電子郵件」一個線程ThreadedSteps
,應該睡5分鐘。ThreadedSteps
開始睡5分鐘- 雖然
ThreadedSteps
正在睡覺,RunApiTest
繼續運行黃瓜BDD的其餘步驟 RunApiTest
完成並退出,無需等待ThreadedSteps
完成!
如何讓我的程序等待,直到我的線程完成?
這裏是我的代碼
主要黃瓜類:RunApiTest
@RunWith(Cucumber.class)
@CucumberOptions(plugin={"pretty"}, glue={"mycompany"}, features={"features/"})
public class RunApiTest {
}
黃瓜步驟來觸發線程:email_bdd
@Then("^I should receive an email within (\\d+) minutes$")
public void email_bdd(int arg1) throws Throwable {
Thread thread = new Thread(new ThreadedSteps(arg1));
thread.start();
}
Thread類:ThreadedSteps
public class ThreadedSteps implements Runnable {
private int seconds_g;
public ThreadedSteps(Integer seconds) {
this.seconds_g = seconds;
}
@Override
public void run() {
Boolean result = waitForSecsUntilGmail(this.seconds_g);
}
public void pauseOneMin()
{
Thread.sleep(60000);
}
public Boolean waitForSecsUntilGmail(Integer seconds)
{
long milliseconds = seconds*1000;
long now = Instant.now().toEpochMilli();
long end = now+milliseconds;
while(now<end)
{
//do other stuff, too
pauseOneMin();
}
return true;
}
}
嘗試#1
我嘗試添加join()
到我的線程,但停止我的主要程序的執行,直到線程已完成,然後繼續執行程序的其餘部分。這不是我想要的,我希望線程在主程序繼續執行時進入睡眠狀態。
@Then("^I should receive an email within (\\d+) minutes$")
public void email_bdd(int arg1) throws Throwable {
Thread thread = new Thread(new ThreadedSteps(arg1));
thread.start();
thread.join();
}
是的,我給'RunApiTest'添加了一個'@ AfterClass'並添加了'join()',並且它最後運行了,但是這個步驟的結果保存錯了......我想我只是要去改爲使用maven parellel插件。 https://github.com/temyers/cucumber-jvm-parallel-plugin – Kayvar