当前位置: 首页 > 知识库问答 >
问题:

JUNIT测试-为什么构造函数被调用两次

袁高明
2023-03-14

正如我的类名所暗示的那样:如果我的类是迭代器的实例,我想测试一下。因此,我想知道,如果它只需要实现接口就可以这样做,似乎就足够了。

然而,当我通过JUNIT Test运行以下类时,我得到了以下控制台输出:

Do something!

Do something!

I did something!

似乎类构造函数被调用了两次!但是我不知道第二次调用来自哪里。我已经测试了“if”参数的变体以排除instanceof有故障,例如

// if (a instanceof Object) {
// if (a instanceof Iterator) {
// if (2 > 3) {

然而,它在所有3种情况下都被调用了。因此,我假设Unit Test首先尝试,需要为自己创建一个类的对象来执行所有测试,因为它们是类的一部分。这是正确的吗(?)

import java.util.Iterator;

import org.junit.Test;

public class InstanceOfIteratorTest implements Iterator {

    @Test
    public void test1() {
        InstanceOfIteratorTest a = new InstanceOfIteratorTest();
        if (a instanceof Iterator) {
            System.out.println("I did something!");
        } else {
            System.out.println("I did nothing!");
        }
    }

    public InstanceOfIteratorTest() {
        System.out.println("Do something!");
    }

    @Override
    public boolean hasNext() {
            throw new java.lang.UnsupportedOperationException("blub");
    }

    @Override
    public Integer next() {
            throw new java.lang.UnsupportedOperationException("blub");
    }

    @Override
    public void remove() {
            throw new java.lang.UnsupportedOperationException("blub");
    }
}

共有2个答案

白坚壁
2023-03-14

在Java,如果不创建Object并调用construstor,就不可能调用非静态方法。当然,Junit必须调用construstor,所以真正的代码:

在朱尼特:

  ...
  InstanceOfIteratorTest l = new InstanceOfIteratorTest(); // print "Do something!"
  l.test1();

在l.test1中:

    InstanceOfIteratorTest a = new InstanceOfIteratorTest(); // print "Do something!"
    if (a instanceof Iterator) {
        System.out.println("I did something!"); // print "I did something!"
    } else {
        System.out.println("I did nothing!");
    }

您可以将代码更改为:

@Test
public void test1() {
    if (this instanceof Iterator) {
        System.out.println("I did something!");
    } else {
        System.out.println("I did nothing!");
    }
}

在这种情况下“做点什么!”只打印一次。

鄢博简
2023-03-14

test1()是类InstanceOfIteratorTest的实例方法,所以是的,JUnit需要先创建实例,然后调用该方法。这就是实例的工作方式。

 类似资料:
  • 问题内容: 在以下示例中,当单击时,将显示而不是。为什么?您将如何解决? 问题答案: React的对帐算法假定没有相反的信息,如果自定义组件出现在后续渲染的同一位置,则它与以前的组件相同,因此将重用前一个实例,而不是创建一个新实例。 如果要实现,则会看到被调用。 不同的节点类型 元素不太可能生成看起来像a 会生成的DOM 。无需花费时间尝试匹配这两种结构,React只是从头开始重建树。 作为推论,

  • 我的react组件的构造函数被调用了两次,但我不知道为什么。我正在使用react redux存储我的应用程序的语言。我有一个基于浏览器语言设置默认语言的函数。LoginPage是第一个获得render的组件,因此我在其构造函数中调用了我的函数。基本上,它所做的就是比较并分派一个动作。当我用redux开发工具检查我的状态时,我看到它被调度了两次。我在构造函数中打印了虚拟数据,它也打印了两次。 登录页

  • 我是新的反应,我试图用它开发一个简单的网络应用程序,但我得到了一个错误。当我加载一个类组件时,我的构造函数被调用两次,你能帮忙吗? 原木地被击中两次。在一些组件中,我希望进行一个命中DB的API调用,但我只想命中它一次。在许多情况下,使用并不方便,因为道具只出现在之后,因此我想在中调用(我不会使用setState,这会导致重新加载render)。 提前感谢

  • 伙计们,我是JUnit测试的新手,并试图很好地掌握它,现在我正在为一个构造函数(用于创建有向图的有向图类)编写JUnit测试,该构造函数在读取负int值时抛出IllegalArgumentExctive,如果一切正常(节点值的数量)大于零,则创建一个图。 有向图类: 下面是我试图写的测试: 我应该如何使用一个(或两个)测试用例来测试这两个用例?如果“in”没有检测到-ve值,我就得到java。否则

  • 根据我的理解,当创建了临时对象时,将调用move构造函数。这里,函数返回一个临时对象,但我的程序没有打印来自移动构造函数的消息:

  • 例如,我有一个这样的课; 我要做的是为模拟的构造函数编写单元测试。 如果是静态的,那么这将很容易,因为我可以使用然后调用构造函数。 有人知道有什么办法吗?