单例 DI 的 picocontainer
picocontainer for singleton DI
我正在尝试将 picocontainer 用于 DI,但仍然多次实例化我的共享对象,而不是作为单例自动管理。下面举个例子来说明。 类 ASteps 和 BSteps 通过它们的构造函数接收一个 SharedObject 实例。我希望 picocontainer 将其作为单例进行管理:根据 Cucumber 文档仅实例化一次。相反,我看到它为 ASteps 实例化一次,为 BSteps 实例化一次:
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");
}
}
pico容器的缓存是reset场景之间,当世界在场景结束时被处理掉。
这非常符合每个设计以避免场景之间的状态泄漏并使它们隔离,因此测试顺序不会影响结果。
如果你确实希望在场景 A 和场景 B 之间保持状态,你要么需要在 pico 容器之外自己处理 SharedObject
,要么你可以明确这两个场景之间的依赖关系——因为例如使用 Background.
我希望现在回答你的问题还为时不晚。
其实,你可以拥有你想要的。
我看到您还想拥有一个浏览器实例。
您必须使用静态对象才能做到这一点。
我创建了一点 class 以避免每次测试之间驱动程序的 Open/close。它由 picocontainer 管理。在您的 stepDefinition classes 中,您必须实现 "same" 构造函数。
这是一个示例:
public class myStepDefinition{
private Drivers context;
public myStepDefinition(Drivers context){
this.context = context;
// whatever you want to do
}
}
public class Drivers {
private static boolean initialized = false;
private static WebDriver driver;
@Before
public void initialize(){
if (!initialized){
initialized = true;
driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.get("http://www.myurl.url");
}
}
public static WebDriver getDriver(){
return driver;
}
}
请记住,您必须在每次测试(通过或失败)后返回登录页面或起始页面
此致,
尼古拉斯
我正在尝试将 picocontainer 用于 DI,但仍然多次实例化我的共享对象,而不是作为单例自动管理。下面举个例子来说明。 类 ASteps 和 BSteps 通过它们的构造函数接收一个 SharedObject 实例。我希望 picocontainer 将其作为单例进行管理:根据 Cucumber 文档仅实例化一次。相反,我看到它为 ASteps 实例化一次,为 BSteps 实例化一次:
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");
}
}
pico容器的缓存是reset场景之间,当世界在场景结束时被处理掉。
这非常符合每个设计以避免场景之间的状态泄漏并使它们隔离,因此测试顺序不会影响结果。
如果你确实希望在场景 A 和场景 B 之间保持状态,你要么需要在 pico 容器之外自己处理 SharedObject
,要么你可以明确这两个场景之间的依赖关系——因为例如使用 Background.
我希望现在回答你的问题还为时不晚。
其实,你可以拥有你想要的。 我看到您还想拥有一个浏览器实例。 您必须使用静态对象才能做到这一点。 我创建了一点 class 以避免每次测试之间驱动程序的 Open/close。它由 picocontainer 管理。在您的 stepDefinition classes 中,您必须实现 "same" 构造函数。
这是一个示例:
public class myStepDefinition{
private Drivers context;
public myStepDefinition(Drivers context){
this.context = context;
// whatever you want to do
}
}
public class Drivers {
private static boolean initialized = false;
private static WebDriver driver;
@Before
public void initialize(){
if (!initialized){
initialized = true;
driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.get("http://www.myurl.url");
}
}
public static WebDriver getDriver(){
return driver;
}
}
请记住,您必须在每次测试(通过或失败)后返回登录页面或起始页面
此致,
尼古拉斯