我的目的是为我的cucumberguice单元测试生成EntityManager和Logger SFL4J实现。
我创建了以下资源生成器
public class MockResourcesWeb {
private static final Logger logger = LoggerFactory.getLogger(MockResourcesWeb.class);
private EntityManager entityManager;
@PostConstruct
void init() {
try {
entityManager = Persistence.createEntityManagerFactory("h2-test").createEntityManager();
} catch (Exception e) {
logger.warn("Failed to initialize persistence unit", e);
}
}
@Produces
public EntityManager getEntityManager(InjectionPoint injectionPoint) {
return entityManager;
}
@Produces
public Logger produceLog(InjectionPoint injectionPoint) {
return LoggerFactory.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}
}
现在,我想我应该使用AbstractModule的实现来绑定这些类,所以:公共类ServiceModule将AbstractModule{@Override protected void configure(){bind(EntityManager.class)。扩展到(?);//。。。(进一步绑定)}
我不知道如何实现这一点。我也试着解释一下:
bind( EntityManager.class ).to(Persistence.createEntityManagerFactory("h2-test").createEntityManager());
但它仍然无法编译。
有什么建议吗?
我的目的是为我的cucumberguice单元测试生成EntityManager和Logger SFL4J实现。
使用guice注入拥有EntityManager
和SFL4J
的实例
您可以使用cucumber-guice
如下所示
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-guice</artifactId>
<version>6.4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>4.2.3</version>
<scope>test</scope>
</dependency>
然后在全局
类中
import com.google.inject.Singleton;
import io.cucumber.guice.ScenarioScoped;
// Scenario scoped it is used to show Guice
// what will be the shared classes/variables and instantiate them only in here
@ScenarioScoped
//@Singleton
public class Global {
public EntityManager entityManager = new EntityManager();
}
创建一个BasePage
类并在构造函数中传递Global
//import classes
public class BasePage {
protected Global global;
public BasePage(Global global) {
this.global = global;
}
}
现在在步骤定义中(单元测试或其他测试)
import com.google.inject.Inject;
//import other classes as necessary
public class StepDefs extends BasePage {
public static EntityManager entityMgr;
@Inject
public StepDefs(Global global) {
super(global);
StepDefs.entityMgr = global.entityManager
}
//use entityMgr as needed
//note that a new instance of entityMgr will be created for each scenario in feature file`
// to create an instance that will last for all tests use @singleton in Global class . ex : for sfl4j
}
可以自动绑定泛型类吗?考虑一下: 通用接口: 长子类型: 字符串子类型: 自定义模块:公共类CustomModule扩展AbstractModule{ } 主要的 是否可以以某种方式(例如:基抽象类、反射或其他)自动绑定
我希望向sbt添加一个自定义源生成器,并将其与scalapb(Scala协议缓冲区生成器)一起使用。每一个都独立工作。然而,当两者结合在一起时,项目在清理后第一次编译失败。如果我再次运行compile,它就会成功。 错误消息: 要再现此错误,您需要在src/main/protobuf中至少有一个proto文件。 我的自定义任务和scalapb这两个源生成器会发生冲突,这让我感到困惑。它们不应该都写
我是一个尝试使用Guice的人(这里是新手!!)我的一个项目。 所以我有一个 我的实现是 我还将DataQueue接口定义为 DataQueue的实现如下 在我的AppModule.Configure方法中,我有以下代码 我的ConsumerFactory是一个带有create()方法的接口,该方法返回一个使用者 我的DataQueueFactory是一个带有create()方法的接口,该方法返回
问题内容: 之间有什么区别 与 我在src / test / resources中有资源,我正在尝试从单元测试中访问它们。这是典型的maven样式目录结构。 我期望两者的行为相同。但是事实并非如此。getClass()。getResource()无法获取资源,而从Thread可以获取资源。 那么它们有何不同? 问题答案: 有一种特殊情况使第一个类运行(这就是为什么必须将main()方法声明为静态的
两者之间有什么区别 VS 我在src/test/resources中有资源&我正试图从单元测试中访问它们。这是一种典型的maven风格目录结构。
由于绑定是在绑定模块中定义的,Google Guice 会在需要注入依赖项时使用它们。如果不存在绑定,它可以尝试创建即时绑定。绑定模块中存在的绑定称为显式绑定并且具有更高的优先级,而即时绑定称为隐式绑定。如果两种类型的绑定都存在,则考虑使用显式绑定进行映射。 以下是三种类型的即时绑定的示例。 绑定类型 描述 可注入的构造函数 非私有、无参数构造函数有资格进行即时绑定。另一种方法是使用@Inject