Я пытаюсь использовать picocontainer для DI, но все же получаю свой общий объект, созданный несколько раз, вместо автоматического управления в качестве одноэлементного. Вот пример для иллюстрации. Классы ASteps и BSteps получают экземпляр SharedObject через свои конструкторы. Я ожидал, что это будет управляться как однотонный пикоконтейнер: экземпляр только один раз, согласно документам Cucumber. Вместо этого, я вижу, он получает экземпляр раз для ASteps и один раз для BSteps:picocontainer для singleton DI
Running my.domain.CucumberRunTest
INFO [main] (CucumberHooks.java:15) - Executing before()
INFO [main] (SharedObject.java:11) - SharedObject - instantiated
INFO [main] (ASteps.java:21) - Executing a_step_one()
INFO [main] (ASteps.java:26) - Executing a_step_two()
INFO [main] (ASteps.java:31) - Executing a_step_three()
INFO [main] (CucumberHooks.java:20) - Executing after()
INFO [main] (CucumberHooks.java:15) - Executing before()
INFO [main] (SharedObject.java:11) - SharedObject - instantiated
INFO [main] (BSteps.java:23) - Executing b_step_one()
INFO [main] (BSteps.java:28) - Executing b_step_two()
INFO [main] (BSteps.java:33) - Executing b_step_three()
INFO [main] (CucumberHooks.java:20) - Executing after()
Что я делаю неправильно? Вот код:
package my.domain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
public class ASteps {
final Logger log = LoggerFactory.getLogger(getClass());
SharedObject sharedObject;
public ASteps(SharedObject sharedObject) {
this.sharedObject = sharedObject;
}
@Given("^A step one$")
public void a_step_one() {
log.info("Executing a_step_one()");
}
@When("^A step two$")
public void a_step_two() {
log.info("Executing a_step_two()");
}
@Then("^A step three$")
public void a_step_three() {
log.info("Executing a_step_three()");
}
}
************************
package my.domain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
public class BSteps {
final Logger log = LoggerFactory.getLogger(getClass());
SharedObject sharedObject;
public BSteps(SharedObject sharedObject) {
this.sharedObject = sharedObject;
}
@Given("^B step one$")
public void b_step_one() {
log.info("Executing b_step_one()");
}
@When("^B step two$")
public void b_step_two() {
log.info("Executing b_step_two()");
}
@Then("^B step three$")
public void b_step_three() {
log.info("Executing b_step_three()");
}
}
************************
package my.domain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cucumber.api.java.After;
import cucumber.api.java.Before;
public class CucumberHooks {
final Logger log = LoggerFactory.getLogger(getClass());
@Before
public void before() {
log.info("Executing before()");
}
@After
public void after() {
log.info("Executing after()");
}
}
*********************
package my.domain;
import org.junit.runner.RunWith;
import cucumber.api.junit.Cucumber;
@RunWith(Cucumber.class)
public class CucumberRunTest {
}
**********************
package my.domain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SharedObject {
final Logger log = LoggerFactory.getLogger(getClass());
public SharedObject() {
log.info("SharedObject - instantiated");
}
}
Спасибо, Себастьян, это очень полезно. В этом случае я не вижу большого значения при использовании picocontainer (я могу получить тот же результат с обычными старыми локальными переменными). Я создаю платформу автоматизации тестирования и хочу определить различные области применения для разных видов ресурсов: ресурсы с областью сценариев (например, экземпляр WebDriver) или ресурсы с охватом (например, конфигурация выполнения, соединения с БД и другие неизменные или дорогие ресурсы). Мне все еще нужно понять весь жизненный цикл JCM Cucumber. Знаете ли вы какие-нибудь хорошие ресурсы для этого? Или исходный код мой лучший вариант? – Pablo
@Pablo Боюсь, я ничего не знаю - я обычно проверяю источники огурца-jvm. Они, однако, хорошо написаны, так что это несколько легко следовать. Запустите CucumberScenario # run (https://github.com/cucumber/cucumber-jvm/blob/master/core/src/main/java/cucumber/runtime/model/CucumberScenario.java#L36), вот где магия происходит для сценария. –