如何用假测试模块代替guice模块进行单元测试?

jslywgbw  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(394)

下面是我们如何在新应用程序中使用guice:

public class ObjectFactory {
  private static final ObjectFactory instance = new ObjectFactory();
  private final Injector injector;

  private ObjectFactory() throws RuntimeException {
    this.injector = Guice.createInjector(new Module1());
  }

  public static final ObjectFactory getInstance() {
    return instance;
  }

  public TaskExecutor getTaskExecutor() {
    return injector.getInstance(TaskExecutor.class);
  }
}
``` `Module1` 定义 `TaskExecutor` 需要建造。
在我们使用的代码中 `ObjectFactory.getInstance().getTaskExecutor()` 获得 `TaskExecutor` .
在单元测试中,我们希望能够用 `FakeTaskExecutor` 本质上我们想得到一个 `FakeTaskExecutor` 什么时候 `ObjectFactory.getInstance().getTaskExecutor()` 被称为。
我在考虑实施一个 `FakeModule` 将由喷油器使用,而不是 `Module1` .
在Spring,我们只会使用 `@Autowired` 注解,然后为 `Test` 以及 `Production` 使用 `Spring4JunitRunner` ; 我们正试图对guice做类似的事情。
xa9qqrwz

xa9qqrwz1#

好吧,首先:你似乎没有按预期的方式使用guice。一般来说,你想用 Guice.createInjector() 启动整个应用程序,让它为您创建所有构造函数参数,而无需调用 new .
典型的用例可能是这样的:

public class Foo {
  private final TaskExecutor executor;

  @Inject
  public Foo(TaskExecutor executor) {
    this.executor = executor;
  }
}

这是因为foo的示例本身是注入的,一直到对象图。请参阅:入门
通过依赖项注入,对象接受其构造函数中的依赖项。要构造一个对象,首先要构建它的依赖关系。但要构建每个依赖项,需要它的依赖项,以此类推。所以当你构建一个对象时,你真的需要构建一个对象图。
手工构建对象图是劳动密集型的,容易出错,并且使测试变得困难。相反,guice可以为您构建对象图。但是首先,guice需要被配置成完全按照您的需要构建图形。
因此,通常情况下,您不会创建一个单例模式并将注入器放入其中,因为您不应该调用 Guice.createInstance 在你的主要班级之外;让注射器为你做所有的工作。
尽管如此,要解决你真正想问的问题,你需要使用jukito。
junit、guice和mockito的联合力量。而且这听起来像是一种很酷的武术。
让我们回到我上面描述的用例。在朱基托,你会写 FooTest 这样地:

@RunWith(JukitoRunner.class)
public class FooTest {
  public static class Module extends JukitoModule {
    @Override
    protected void configureTest() {
      bindMock(TaskExecutor.class).in(TestSingleton.class);
    }
  }

  @Test
  public void testSomething(Foo foo, TaskExecutor executor) {
     foo.doSomething();
     verify(executor, times(2)).someMethod(eq("Hello World"));
  }
}

这将验证mockito通过jukito生成的mock对象是否具有该方法 someMethod 用绳子打了两次电话 "Hello World" 两次都是。
这就是为什么您不希望使用 ObjectFactory 以你描述的方式;jukito在单元测试中为您创建了一个注入器,而注入一个mock将非常困难,您必须编写大量的样板文件。

相关问题