为什么使用JUnit调用fail()在Java类中进行编译

Gui*_*lmi 4 java junit unit-testing netbeans

这似乎不应该编译和运行,因为Object没有fail()方法.在编译时是一个时髦的事情发生?(我使用的是NetBeans):

import static org.junit.Assert.*;
import org.junit.Test;

public class Test {

    @Test
    public void hello() {
        fail();

    }
}
Run Code Online (Sandbox Code Playgroud)

问候,

圭多

Pla*_*ure 18

您的import static行将Assert该类的所有静态成员导入到编译单元的静态命名空间中.该fail()呼叫指Assert.fail().

您在fail()定义位置时遇到的困惑正是我通常不建议使用的原因import static.在我自己的代码中,我通常导入该类并使用它来调用静态方法:

import org.junit.Assert;
import org.junit.Test;

public class Test {

    @Test
    public void hello() {
        Assert.fail();
    }
}
Run Code Online (Sandbox Code Playgroud)

更具可读性.

但是,正如JB Nizet指出的那样,使用import staticJUnit的断言是相当普遍的做法; 当你编写和阅读足够多的JUnit测试时,知道断言方法的来源将成为第二天性.

  • 您可以删除静态导入,并调用Assert.fail().我同意静态导入不应该被滥用,但在JUnit测试中静态导入Assert.*是一种普遍接受的做法. (2认同)

Oli*_*POP 6

这是完全正确的,它将运行和编译 - 我已经使用eclipse进行了检查.原因是静态导入:

import static org.junit.Assert.*;
Run Code Online (Sandbox Code Playgroud)

它添加了org.junit.Assert类中的所有静态字段或方法 - 因此包括fail()方法.

然而,可能出现的问题是测试类的名称与注释的名称相同

@Test
Run Code Online (Sandbox Code Playgroud)

因此会产生错误:

导入org.junit.Test与同一文件中定义的类型冲突

  • +1用于指出类名的辅助问题.不直接相关,但它可能有助于某人学到一些东西:-) (2认同)