【问题标题】:Injector error while running lagom test运行 lagom 测试时发生喷油器错误
【发布时间】:2019-02-05 23:14:51
【问题描述】:

我正在使用 Lagom 框架并通过 mvn test 运行测试。测试失败并出现 com.google.inject.CreationException。堆栈跟踪是

com.google.inject.CreationException: Unable to create injector, see 
the following errors:

1) No implementation for 
com.lightbend.lagom.javadsl.persistence.PersistentEntityRegistry was 
bound.
while locating 
com.lightbend.lagom.javadsl.persistence.PersistentEntityRegistry
for parameter 0 at com.pv.svc.chat.impl.ChatServiceImpl.<init>
(ChatServiceImpl.java:45)
at 
com.lightbend.lagom.javadsl.server.ServiceGuiceSupport.
bindServices(ServiceGuiceSupport.java:74) (via modules: 
com.google.inject.util.Modules$OverrideModule -> 
com.pv.svc.chat.impl.ChatServiceModule)

2) No implementation for 
com.lightbend.lagom.javadsl.persistence.ReadSide was bound.
while locating com.lightbend.lagom.javadsl.persistence.ReadSide
for parameter 1 at com.pv.svc.chat.impl.ChatServiceImpl.<init>
(ChatServiceImpl.java:45)
 at 
com.lightbend.lagom.javadsl.server.ServiceGuiceSupport.
bindServices(ServiceGuiceSupport.java:74) (via modules: 
com.google.inject.util.Modules$OverrideModule -> 
com.pv.svc.chat.impl.ChatServiceModule)

3) No implementation for 
com.lightbend.lagom.javadsl.persistence.jdbc.JdbcSession was bound.
while locating 
com.lightbend.lagom.javadsl.persistence.jdbc.JdbcSession
for parameter 2 at com.pv.svc.chat.impl.ChatServiceImpl.<init>
(ChatServiceImpl.java:45)
at 
com.lightbend.lagom.javadsl.server.ServiceGuiceSupport.
bindServices(ServiceGuiceSupport.java:74) (via modules: 
com.google.inject.util.Modules$OverrideModule -> 
com.pv.svc.chat.impl.ChatServiceModule)

3 errors
at 

com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist
(Errors.java:466)
at 
com.google.inject.internal.InternalInjectorCreator.  
initializeStatically(InternalInjectorCreator.java:155)
at 
com.google.inject.internal.InternalInjectorCreator.build
(InternalInjectorCreator.java:107)
at com.google.inject.Guice.createInjector(Guice.java:96)
at com.google.inject.Guice.createInjector(Guice.java:84)
at play.api.inject.guice.GuiceBuilder.injector
(GuiceInjectorBuilder.scala:181)
at play.inject.guice.GuiceBuilder.injector
(GuiceBuilder.java:208)
at play.inject.guice.GuiceApplicationBuilder.build
(GuiceApplicationBuilder.java:127)
at com.lightbend.lagom.javadsl.testkit.ServiceTest$.startServer
(ServiceTest.scala:282)
at com.lightbend.lagom.javadsl.testkit.ServiceTest.startServer
(ServiceTest.scala)
at com.pv.svc.chat.impl.ChatServiceTest.setUp
(ChatServiceTest.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0
(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall
(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run
(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively
(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.RunBefores.evaluate
(RunBefores.java:24)
at org.junit.internal.runners.statements.RunAfters.evaluate
(RunAfters.java:27)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute
(JUnit4Provider.java:252)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet
(JUnit4Provider.java:141)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke
(JUnit4Provider.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0
(Native Method)
.....

我了解 Lagom 在运行测试时不会注入依赖项。我将 JDBC 用于持久实体和读取端。有什么办法可以解决这个问题。我的测试服务器设置

private static TestServer server;

@BeforeClass
public static void setUp() {
    server = ServiceTest.startServer(defaultSetup());
}

@AfterClass
public static void tearDown() {
    if (server != null) {
        server.stop();
        server = null;
    }
}

我知道对于 Cassandra,我们必须使用 defaultSetup().withCassandra(true),但是 JDBC 呢?我也在使用 Kakfa 来接收消息。请帮忙。

【问题讨论】:

  • 嗨 shik9,Lagom 的测试套件目前仅支持 Cassandra 后端(不支持 JDBC)。有关更新,请参阅 github.com/lagom/lagom/issues/304
  • 嗨@ignasi35,我认为这是不可能的,但有什么方法可以模拟整个数据库。我需要三样东西 PersistentEntityRegistry、ReadSide 和 JdbcSession。

标签: java jdbc lagom


【解决方案1】:

您需要将 Cassandra 添加到您的设置中

@BeforeClass
public static void setUp() {
    server = ServiceTest.startServer(defaultSetup().withCassandra(true));
}

【讨论】:

    【解决方案2】:

    您可以在 build.sbt 中添加 cassandra 选项:

    lagomCassandraEnabled in ThisBuild := true
    

    以及以下任意选项:

    lagomCassandraPort in ThisBuild := 9042
    lagomCassandraCleanOnStart in ThisBuild := true
    lagomCassandraYamlFile in ThisBuild := Some((baseDirectory in ThisBuild).value / "project" / "cassandra.yml")
    

    添加到 Dependencies.scala(如果使用):

    import com.lightbend.lagom.sbt.LagomImport.{......, lagomJavadslPersistenceCassandra}
    

    并添加到服务实现依赖项:

     val implYourServiceName= Seq(
        .......
        lagomJavadslPersistenceCassandra,
        ......
      )
    

    Outwise(没有依赖文件)添加到 build.sbt 以下依赖项:

    lazy val `your-service-name-impl` = project("your-service-name-impl")
      .enablePlugins( .... your plugins here ....)
      .settings(libraryDependencies ++= Seq(
        .......
        lagomJavadslPersistenceCassandra,
        ......))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 1970-01-01
      相关资源
      最近更新 更多