【问题标题】:[Easy|Power]Mock: make constructor.newInstance(...) throw an exception?[Easy|Power]Mock:让constructor.newInstance(...) 抛出异常?
【发布时间】:2019-05-23 07:25:53
【问题描述】:

我想让constructor.newInstance(...) 在单元测试中抛出异常。我想检查是否在以下(虚拟)代码中到达了 else-branch:

public <T extends IInterface> instantiate(final Constructor<IInterface> constructor) {
    try {
        return constructor.newInstance(arg);
        } catch (Exception e) {
        return null;
    }
}

我想联系null 案件。我可以使用 (Power)Mockito 模拟 吗?

理论上是可以的

class TestImplementation implements IInterface {
    public TestImplementation(Arg.class) {
        throw new InstantiationException("just for your test case");
    }
}

但我很好奇我是否可以通过模拟来实现这一点。

【问题讨论】:

  • 你可以传递会导致异常的参数,否则,模拟它,这就是模拟的目的
  • 仅作记录:考虑返回 Optional&lt;IInterface&gt; 以避免返回 null!额外提示:不要使用“匈牙利”表示法,如 java 中的 IInterface。使用有意义的名称,不要让读者负担这些细节(这在 2019 年不应该那么重要)。
  • 你为什么用constructor.newInstance而不是Function&lt;Arg,T&gt;
  • @chrylis:我正在测试别人的代码,这是通过的参数。如何使用Function&lt;Arg,T&gt; 代替构造函数? (arg 没有传递给方法)
  • @GhostCat:匈牙利符号很简洁

标签: java exception junit constructor mocking


【解决方案1】:

java.lang.Constructor 类是最终类,因此默认情况下很难模拟。最新版本的 Mockito 支持模拟最终类,据我所知,EasyMock 不支持。

因此,您的选择可能是:

  • Mockito(最新版本,启用了新的实验性“模拟决赛”)
  • PowerMock(ito)
  • JMockit

并且记录在案:传递一些“虚拟”类的 Class 实例,就像您在问题中建议的那样,比使用模拟框架更好

你必须明白:你不使用模拟,因为你可以。只有在必须时才使用它!在您的情况下,有一个简单、直接的非模拟解决方案来测试您的生产代码。

所以:使用 TestImplementation.class 并忘记在这里使用模拟框架。

【讨论】:

    猜你喜欢
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多