如何用假测试模块替换 Guice 模块进行单元测试?

2023-12-14

这是我们的使用方式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 when ObjectFactory.getInstance().getTaskExecutor()叫做。

我正在考虑实施一个FakeModule它将被注射器使用,而不是Module1.

在 Spring 中,我们只需使用@Autowired注释,然后定义单独的beanTest and Production编写代码并运行我们的测试Spring4JunitRunner;我们正在尝试对 Guice 做类似的事情。


好的,首先要做的事情是:您似乎没有按照预期的方式使用 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 的综合威力。而且这听起来像是一门很酷的武术。

让我们回到上面描述的用例。在 Jukito 中,你会写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"));
  }
}

这将验证您的模拟对象,由生成Mockitovia Jukito 有这个方法someMethod用字符串调用它两次"Hello World"两次。

这就是为什么你不想用生成对象ObjectFactory以你描述的方式; Jukito 在其单元测试中为您创建了 Injector,而注入 Mock 会非常困难,而且您必须编写大量样板文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用假测试模块替换 Guice 模块进行单元测试? 的相关文章

随机推荐

  • 列表视图中选定索引的问题

    我有一个数组列表 其中包含我自己的类的对象 我想从数组列表中获取对象 该对象的索引 listview的selectedindex 我试过这个 TrackInformation t TrackInformation SongList list
  • 如何在 C++ 中可视化/绘制图表?

    我刚刚了解了图表 我想在随机创建它们时绘制它们 我该怎么做呢 EDIT 我说的是图 它是顶点之间的边的集合 而不是 y f x 的图 什么样的图表 有向图与散点图不同 3D 和 或 2D 图表 你关心它是c还是c 吗 您想要自己编写还是正在
  • C/C++ 中的指针/数组语法 (char **p, *p[n])

    对于指针 我对何时使用 char 或 char 或 array n 等的声明和函数参数感到困惑 就像如果一个函数采用 array n 参数 我是否通过它是 类型吗 我尝试使用从右到左的规则 知道 p 将是一个指向 char 的指针 char
  • 如何使用Fiddler监控WCF服务

    我有一个 WCF 服务 它接受复杂类型并返回一些数据 我想使用 Fiddler 来查看对服务的传入请求是什么样的 客户端是 net 控制台应用程序 它使用服务引用代理 Fiddler 可以做到这一点吗 我是这个工具的新手 过去只使用它通过请
  • python模块的动态加载[重复]

    这个问题在这里已经有答案了 在 python 中 如何在程序运行时动态地将模块添加到包中 我希望能够从外部进程将模块添加到包目录 并能够在我的程序中使用这些新模块 import package def doSomething name pk
  • Qt 和共享文件夹中的文件

    我可以使用 Qt 来选择 打开共享文件夹上的文件吗 我尝试使用 QFileDialog 但似乎没有 网络 类别 如标准 Windows 资源管理器中那样 您需要指定您使用的 Qt 版本 4 7 版本支持本机文件对话框并默认使用它们 请参阅此
  • 如何调整 JavaFX 图像的大小?

    我有一个javafx scene image Image 我想调整它的大小 例如按给定因子缩放 如何做到这一点 无需转换为BufferedImage 有关质量和性能的选项有哪些 例如插值类型 有几个看起来相似的问题 但我找不到问同样问题的人
  • 锁屏时捕获返回按钮按下事件

    我正在尝试编写一个小应用程序来捕获KeyEvent按下后退按钮的次数 当屏幕锁定时 我发现你可以轻松覆盖onKeyDown or onBackPressed为了捕获此事件 但这仅在活动正在运行时才有效 据我了解 在某些 Android 手机
  • Powershell eq 运算符表示哈希值不同,而 Write-Host 显示相反

    我有一个脚本 它定期生成目录中所有文件的列表 然后将结果的文本文件写入不同的目录 我想更改此设置 以便它检查输出目录中的最新文本文件 并且仅在存在差异时才创建一个新文件 这看起来很简单 这是我尝试过的 首先 我获取目录中的最新文件 获取哈希
  • 如何将 XML 查询结果保存到文件中

    我有一个 SQL 查询 并且正在使用 For XML Path 将结果生成为 XML 谁能帮我将 XML 输出转换为 a xml 文件并保存在计算机的特定文件夹中 也想知道除了BCP为了达成这个 你可以尝试使用xp cmdshell Rea
  • C++ 中的 Windows 服务

    我想用 C 创建一个将定期运行的应用程序 很像Windows服务 是否可以用 C 创建 Windows 服务 如果是的话怎么办 有这方面的教程吗 编辑 如何为 Windows 服务创建安装程序 正如另一个答案所示 您需要创建一个普通的 C
  • Jersey ExceptionMapper 未被调用

    我试图调用此异常映射器以返回 404 未找到响应 但它始终返回 500 内部错误 泽西岛版本是2 22 1 下面的代码片段 感谢所有帮助 Thanks 异常映射器类 package org learn rest messengerdemo
  • 引用类时出现 NHibernate 映射问题(延迟加载问题?)

    我正在使用 NHibernate Fluent 来处理我的数据库 并且在查询引用其他数据的数据时遇到问题 我的简单问题是 我是否需要在映射中定义一些 BelongsTo 等 或者在一侧定义引用是否足够 请参阅下面的映射示例 如果是这样 怎么
  • 背景图片在 IE11 中不显示

    由于某种原因 背景图像在 IE11 Windows 7 Pro 中根本不显示 home position relative height 620px background image url images bg home3 jpg back
  • 使用 XPath 从具有不必要名称空间的文档中提取 XOM 元素

    我正在尝试使用 XOM 解析外部系统返回的一些 HTML HTML 看起来像这样 div Help I am trapped in a fortune cookie factory div 实际上它更加混乱 但它有这个 DOCTYPE 声明
  • iPhone 应用程序内的捐赠功能

    我计划开发一个免费的应用程序 这对很多人来说都是有用的 因此 我计划在我的应用程序中放置一个捐赠按钮 因此 如果有人发现它有用 他们就会为开发捐款 如果我们实现应用内购买来实现这个功能好不好 我不确定这是否可能 如果这个问题有错请纠正我 我
  • 为什么 printf 隐式 float 到 int 转换不起作用?

    请帮助我理解以下 C 输出 include
  • Sqlite 不返回此类表,但在 OnePlusTwo 设备上获取时存在该表

    我已将数据库文件从资产复制到应用程序数据库 并且已成功复制 当我查询任何表时 它不会返回此类表异常 我从该手机中获取了数据库文件 它包含所需的所有表格 我知道这有点奇怪 但此错误仅出现在 OnePlusTwo 设备上 所以我的问题是这是一个
  • 原生 javascript 中的 jQuery index()

    根据 jQuery api get 的补充操作 它接受索引并返回 DOM 节点 index 可以获取 DOM 节点并返回索引 假设我们页面上有一个简单的无序列表 ul li foo li li bar li li baz li ul ind
  • 如何用假测试模块替换 Guice 模块进行单元测试?

    这是我们的使用方式Guice在新的应用程序中 public class ObjectFactory private static final ObjectFactory instance new ObjectFactory private