Java 为什么';t JUnit';s预期异常导致不可预测状态?

Java 为什么';t JUnit';s预期异常导致不可预测状态?,java,junit,expected-exception,Java,Junit,Expected Exception,从: 这是有效的。但是如果测试以不同的顺序运行会怎样呢?@Rule注释是否告诉JUnit在每次测试后重置其状态?是的,对于运行的每个测试,都会重置规则 JUnit的一个关键点是,测试从不依赖于顺序JUnit测试是独立运行的。对于每个单独的测试,(默认)测试运行程序将创建测试类的新实例,并且只调用单个测试方法(以及@Before和@Before方法)。因此,除非您创建一些受顺序影响的静态(或外部)依赖关系,否则测试执行的顺序对结果没有影响。这可能是一个testng问题,但@BeforeSuite或

从:


这是有效的。但是如果测试以不同的顺序运行会怎样呢?@Rule注释是否告诉JUnit在每次测试后重置其状态?

是的,对于运行的每个测试,都会重置规则


JUnit的一个关键点是,测试从不依赖于顺序

JUnit测试是独立运行的。对于每个单独的测试,(默认)测试运行程序将创建测试类的新实例,并且只调用单个测试方法(以及
@Before
@Before
方法)。因此,除非您创建一些受顺序影响的静态(或外部)依赖关系,否则测试执行的顺序对结果没有影响。

这可能是一个testng问题,但@BeforeSuite或等效物呢?这些似乎只适用于在一个类中运行多个测试的情况。我认为这种说法不准确。我认为这取决于单元测试的运行方式。我见过多次测试失败的情况,因为它们更改了未在@之前的中重置的字段。如果您的断言是正确的,那么就没有理由在之前使用
,因为这可以在构造函数中完成。@JohnB您可以在github上查看junit的源代码:每个测试都是一个新实例。像前面的
@这样的东西是为了简单易读,而不是出于必要。是的,理论上,一个测试运行器实现可以为所有测试使用一个实例,但是正是出于测试隔离的原因,这通常是一个坏主意。@AAA JUnit的BeforeClass
是一个静态方法,一个测试可以设置一个全局变量(如系统标志),而另一个则读取该变量,从而创建顺序耦合。我不知道为什么ExpectedException不会发生这种情况。@AAA JUnit记录了应该如何设置测试用例。如果开发人员做了不同的事情,那就是他们的问题。毕竟,你在使用一种工具。按预期使用它。如果你不这样做,你就不能期待任何事情。@SotiriosDelimanolis好的,那么,我应该如何使用ExpectedException?@SotiriosDelimanolis我的观点是,这个答案中的逻辑是错误的。你似乎同意我的看法,说JUnit不能保证这些事情,开发人员应该正确地做。@AAA JUnit(默认情况下,你可以调整它)使用反射来获得你的测试方法。它使用(d)s,例如,
Class 35; getMethods()
,它返回一个
Method[]
,其中元素没有任何特定顺序。JUnit没有指定测试方法调用的执行顺序。因此,作为一名开发人员,如果您添加了依赖于调用顺序的逻辑,那么这样做的风险是您自己承担的。
public class SimpleExpectedExceptionTest {
     @Rule
     public ExpectedException thrown= ExpectedException.none();

     @Test
     public void throwsNothing() {
         // no exception expected, none thrown: passes.
     }

     @Test
     public void throwsExceptionWithSpecificType() {
         thrown.expect(NullPointerException.class);
         throw new NullPointerException();
     }
 }