当前位置: 首页 > 知识库问答 >
问题:

Guice-来自资源生成器的绑定类

王飞虎
2023-03-14

我的目的是为我的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());

但它仍然无法编译。

有什么建议吗?

共有1个答案

戈睿识
2023-03-14

我的目的是为我的cucumberguice单元测试生成EntityManager和Logger SFL4J实现。

使用guice注入拥有EntityManagerSFL4J的实例

您可以使用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