Java 如何测试构造函数中也调用了方法的类的方法?(朱尼特)

Java 如何测试构造函数中也调用了方法的类的方法?(朱尼特),java,junit,tdd,Java,Junit,Tdd,我是测试驱动开发(TDD)的初学者。我经常会遇到一些感觉不太合适的事情: 以一个名为loadStuff()的类为例,如果加载或未加载stuff,该类将返回true或false。在类的构造函数中调用此方法 public class Main { public static void main(String[] args) { new Main(); } public Main() { if (loadStuff())

我是测试驱动开发(TDD)的初学者。我经常会遇到一些感觉不太合适的事情:

以一个名为
loadStuff()
的类为例,如果加载或未加载stuff,该类将返回
true
false
。在类的构造函数中调用此方法

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        if (loadStuff())
            System.out.println("Stuff was loaded from constructor");
        else
            System.out.println("Stuff was not loaded from constructor");
    }

    boolean loadStuff() {
        boolean stuffWasLoaded = true;
        //...
        return stuffWasLoaded;
    }
}
我想使用
JUnit
测试这个
loadStuff()
方法。困扰我的是,我试图测试的方法在我实际测试它之前就在类的构造函数中被调用了:

import org.junit.Test;

import static org.junit.Assert.*;

public class MainTest {

    @Test
    public void testLoadStuff() throws Exception {
        Main main = new Main();

        assertTrue("Stuff was not loaded from test.", main.loadStuff());
    }
}
测试通过,这是输出:

Stuff was loaded from constructor

Process finished with exit code 0
我觉得我这样做是错误的,但我不确定有没有更好的方法


测试在类的构造函数中也被调用的类的方法的正确方法是什么?

这是全新的代码吗?如果使用TDD,则不应出现所述情况

这个周期是:

  • 编写失败的测试(但编译测试)
  • 编写通过测试的最低代码量
  • 重构(整理并删除重复)
  • 在此之后,构造函数中不可能有未经测试的方法调用


    您希望测试类的行为,而不是单个方法本身。决定您想要的行为,编写一个测试预期输出的测试用例,然后编写代码。

    一个选项是编写单元测试,忽略当前的实现细节,而是测试外部可见的行为。为构造函数编写一个或多个测试,也为方法编写一个或多个测试。这就是为什么构造函数只需初始化变量就好了。你能把
    loadStuff()
    公开吗?如果不是这样,反思就可以。
    loadStuff()
    的目的是初始化
    Main
    的变量吗?你到底在测试什么?@VinceEmigh我在测试一个案例,在这个案例中,我有一个特定的管理器,它将XML文件解析为数组,供其他类使用。当管理器被实例化时,它立即开始加载、解析XML文件等过程。我想测试加载和解析文件的方法,以确保它们提供了预期的输出,但要做到这一点,我必须调用构造函数,构造函数无论如何都能做到这一点。我可以从实例化器中调用这些方法,这没有问题,我只是发现将它们都放在构造函数中更简单,因为它们会在之后被调用。我建议分离
    load
    parse
    ,然后公开这些方法,以便它们可以用于对象的客户端。如果希望同时发生
    loadAndParse
    方法(有点像某些网络API使用
    writeAndFlush
    ),则可以公开该方法。如果您希望在使用对象之前加载和分析数据(这就是它位于构造函数中的原因),请在出现问题时抛出异常,然后测试异常。@VinceEmigh好的,我会这样做。非常感谢。是的,这是新代码。我试图遵循这个循环,但我想我一定没有正确地遵循它。感谢您的意见,我将重新评估我所采取的步骤。:)