java - 调用了构造函数中的验证方法

标签 java jmockit

我有一个调用方法的构造函数,如下所示:

public Foo(boolean runExtraStuff) {
    if (runExtraStuff){
        doExtraStuff();
    }
}

doExtraStuff() 方法正在运行一些不容易自行模拟的额外命令(例如数据库检查以初始化某些变量)。也许构造函数不这样做会更好,但这是我目前必须使用的代码。

我想创建一个单元测试以确保当 boolean 值 runExtraStuff 为真时调用 doExtraStuff() 并且当 boolean 值为假时不运行。我正在使用 JMockit。

但是,我不确定如何实现这一点。通常我会在模拟对象上使用 Verifications,但由于我正在测试构造函数,所以我不能以这种方式使用模拟对象。那么如何验证构造函数中的方法是否被调用?

最佳答案

这很简单,即使它需要部分模拟:

@Test
public void runsSetupWhenRequestedOnFooInitialization()
{
    // Partially mocks the class under test:
    new Expectations(Foo.class) {};

    final Foo foo = new Foo(true);

    // Assuming "setup" is not private (if it is, use Deencapsulation.invoke):
    new Verifications() {{ foo.setup(); }};
}

@Test
public void doesNotRunSetupWhenNotRequestedOnFooInitialization()
{
    new Expectations(Foo.class) {};

    final Foo foo = new Foo(false);

    new Verifications() {{ foo.setup(); times = 0; }};
}

当然,在这种情况下最好避免模拟;相反,如果可能的话,测试应该通过 getter 或其他可用方法检查对象的状态。

关于java - 调用了构造函数中的验证方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29753464/

相关文章:

java - 安卓: "Unable to instantiate Fragment"

java - jni 中接口(interface)的 isinstance

java - 在 Java Streams 中按范围分组

java - maven构建时如何阻止从其他存储库下载metadata.xml

unit-testing - 此时缺少对模拟类型的调用;

java - 如何使用 jMockit 模拟 native 方法

java - 当 JMockit 位于类路径上时,Arquillian org.junit.runner.Runner NoClassDefFoundError

java - ArchUnit 规则检查是否在同一包或子包中访问类?

java - JMockit 是否初始化 EJB?

java - 使用 Guice 和 JMockit 对拦截器进行单元测试