当前位置: 首页 > 面试题库 >

如何测试Guice注射剂?

澹台华采
2023-03-14
问题内容

我让Google Guice负责连接对象。但是,如何测试绑定是否运作良好?

例如,假设我们有一个A具有依赖性的类B。如何测试B是否正确注入?

class A {
    private B b;
    public A() {}

    @Inject
    public void setB(B b) {
        this.b = b
    }
}

注意,这里A没有getB()方法,我想断言A.b不是null


问题答案:

对于任何复杂的Guice项目,您都应该添加测试以确保可以使用这些模块来创建您的类。在您的示例中,如果B是Guice无法弄清楚如何创建的类型,则Guice将无法创建A。如果不需要A来启动服务器,但是当服务器处理a时就需要A。请求,这会导致问题。

在我的项目中,我为非平凡的模块编写测试。对于每个模块,我使用requireBinding()来声明模块需要什么绑定,但是没有定义。在测试中,我使用被测模块和另一个提供所需绑定的模块来创建Guice注射器。这是使用JUnit4和JMock的示例:

/** Module that provides LoginService */
public class LoginServiceModule extends AbstractModule {
  @Override 
  protected void configure() {
    requireBinding(UserDao.class);
  }

  @Provides
  LoginService provideLoginService(UserDao dao) {
    ...
  }
}

@RunWith(JMock.class)
public class LoginServiceModuleTest {
  private final Mockery context = new Mockery();

  @Test
  public void testModule() {
    Injector injector = Guice.createInjector(
        new LoginServiceModule(), new ModuleDeps());

    // next line will throw an exception if dependencies missing
    injector.getProvider(LoginService.class);
  }

  private class ModuleDeps extends AbstractModule {
    private final UserDao fakeUserDao;

    public ModuleDeps() {
      fakeUserDao = context.mock(UserDao.class);
    }

    @Override 
    protected void configure() {}

    @Provides
    Server provideUserDao() {
      return fakeUserDao;
    }
  }
}

注意测试仅如何要求提供者。这足以确定Guice可以解析绑定。如果LoginService是由提供者方法创建的,则此测试不会测试提供者方法中的代码。

此测试也不会测试您是否将正确的东西绑定到UserDao,或者绑定的UserDao范围正确。有些人会认为这类事情很少值得检查。如果有问题,它只会发生一次。您应该“测试,直到恐惧变成无聊为止”。

我发现模块测试很有用,因为我经常添加新的注入点,并且很容易忘记添加绑定。

这些requireBinding()调用可以帮助Guice在返回注射器之前捕获丢失的绑定!在上面的示例中,如果requireBinding()调用不存在,测试仍然可以进行,但是我喜欢使用它们,因为它们用作文档。

对于更复杂的模块(例如我的根模块),我可能会使用Modules.override()覆盖测试时不需要的绑定(例如,如果我想验证要创建的根对象,我可能不会不想让它创建将连接到数据库的对象)。对于简单的项目,您可能只测试顶层模块。

注意,除非用注释字段,Guice
不会注入空值,@Nullable因此您很少需要在测试中验证注入的对象是否为非空对象。实际上,当我用构造函数注释构造函数时,@Inject我不会费心检查参数是否正确null(实际上,我的测试通常会注入null到构造函数中以使测试保持简单)。



 类似资料:
  • 我使用< code>Cucumber和< code>Guice作为DI。我遇到了以下问题:我有一个步骤,即 我让这个类作为测试运行它 有一个 由我的使用,我定义了cucumber.properties,我定义了还有一个包含方案的功能文件。现在一切都在工作。 不,我想使用其他MyService实现运行MyStep步骤(当然我不会重复MyStep的代码)我定义了一个具有新场景和新测试类的新功能文件 现

  • 我有一个Maven模块,我在其中定义了一些跨其他几个Maven模块共享的UTIL。在本模块中,我想创建一些单例: 然后我将我的界面绑定到: 假设我想使用另一个Maven模块(比如web服务)中的这个单例,我该如何实现呢?我找到的唯一方法是在util Maven模块中创建一个类,如: 或者,我可以在Guice教程中看到的静态main方法中创建注入器,并将实例保存在某个地方。 然后从我的Web服务中执

  • 基本上我的问题归结为如何让这个测试通过: 但也许我错过了重点:堆栈溢出会让你相信做我正在做的事情是一种罪过(介绍引用喷油器的工厂,当你要求他们制造产品时,他们只是转发给你),而我正在做的是接近服务定位器,这是一个糟糕的举动。但我看不出解决这个问题的方法。 我有一个名为“可视化”的接口,它有7个实现者。运行时,根据您的数据集,我们选择一组可视化工具来创建和呈现。对于有注入器字段的工厂,我只需添加一个

  • 我对使用Guice有疑问。我有一个名为< code>Main的类,它是使用Guice和一个方法注入的构造函数,每次调用该方法都会创建一个类< code>AppThread的o thread对象。< code>AppThread是< code>Main中的私有类。问题是,在线程的执行过程中,我想创建一个class 的对象。此对象是使用Guice注入的构造函数。我不知道注入< code>ClassX的

  • 我已经使用google-guice和辅助注射机制有一段时间了。因为我在scala,刚刚发现scala-guice,我也对使用它感兴趣。但是我对如何使用辅助注射感到困惑。没有使用辅助注射的例子。 因此,我的问题是:是否可以使用scala guice辅助注射,如果可以,请提供一个简单的例子? 此外,对于google-guice,我使用以下库:javax.inject.jar、guice-3.0.jar

  • 我更新了createInjector调用以包含我的JPAPersisteModule。。。 在我的持久化单元声明如下: