Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JUnit测试中,AtomicInteger不会递增_Java_Junit_Increment_Atomicinteger - Fatal编程技术网

Java 在JUnit测试中,AtomicInteger不会递增

Java 在JUnit测试中,AtomicInteger不会递增,java,junit,increment,atomicinteger,Java,Junit,Increment,Atomicinteger,我有下面的JUnit测试,无法解释为什么第二个测试没有通过,两个测试中I的值都是1 public class TestTest { private AtomicInteger ai = new AtomicInteger(1); @Test public void test1() { int i = ai.getAndIncrement(); Assert.assertEquals(1, i); } @Test public void test2()

我有下面的JUnit测试,无法解释为什么第二个测试没有通过,两个测试中
I
的值都是1

public class TestTest {

  private AtomicInteger ai = new AtomicInteger(1);

  @Test
  public void test1() {
    int i = ai.getAndIncrement();
    Assert.assertEquals(1, i);
  }

  @Test
  public void test2() {
    int i = ai.getAndIncrement();
    Assert.assertEquals(2, i);
  }
}
test1
通过,而
test2
失败,并显示以下消息:

java.lang.AssertionError: 
Expected :2
Actual   :1

测试在新实例上运行。
test1()
的行为不会以任何方式影响
test2()
,否则它可能会导致一个失败的测试使随后的所有其他测试失败。这会让你更难找到问题的根源,你不希望这样

如果您想测试多个调用之间的行为,您需要创建一个将这两个方法作为一个单元一起调用的测试,或者转到集成测试,在集成测试中您可以测试大量代码以确保正确工作


您的测试在逻辑上也是错误的,因为您正在递减该值。您(错误地)期望的值将是
0
,而不是
2

测试将在新实例上运行。
test1()
的行为不会以任何方式影响
test2()
,否则它可能会导致一个失败的测试使随后的所有其他测试失败。这会让你更难找到问题的根源,你不希望这样

如果您想测试多个调用之间的行为,您需要创建一个将这两个方法作为一个单元一起调用的测试,或者转到集成测试,在集成测试中您可以测试大量代码以确保正确工作

您的测试在逻辑上也是错误的,因为您正在递减该值。您(错误)的期望值将是
0
,而不是
2

  • 每个带注释的
    @Test
    方法都独立运行,并带有新的重新初始化的
    ai
    值(
    1
    ),因此
    test2
    失败
  • 最好在一个测试中运行
    test1
    test2
    ,以检测正确的工作
    getAndIncrement()
    结果(属于您的实际问题)。看一下代码清单Ai增量

  • 此外,您还可以使用
    @Before
    而不是
    私有AtomicInteger ai=new AtomicInteger(1)。因此,您以原子方式为每个测试确保分配的值
    1

      • 每个带注释的
        @Test
        方法都独立运行,并带有新的重新初始化的
        ai
        值(
        1
        ),因此
        test2
        失败
      • 最好在一个测试中运行
        test1
        test2
        ,以检测正确的工作
        getAndIncrement()
        结果(属于您的实际问题)。看一下代码清单Ai增量

      • 此外,您还可以使用
        @Before
        而不是
        私有AtomicInteger ai=new AtomicInteger(1)。因此,您以原子方式为每个测试确保分配的值
        1


      您可以将“static”添加到AtomicInteger初始化中,每个测试实例将使用相同的变量。像这样:

      private static AtomicInteger ai = new AtomicInteger(1);
      

      但是您还有另一个问题-您不能保证test1将首先运行,test2将第二次运行。因此,您还需要牢记这一点重新编写测试,或者使用@TestMethodOrder(Alphanumeric.class)

      您可以将“static”添加到AtomicInteger初始化中,并且每个测试实例将使用相同的变量。像这样:

      private static AtomicInteger ai = new AtomicInteger(1);
      

      但是您还有另一个问题-您不能保证test1将首先运行,test2将第二次运行。因此,另外,您需要牢记这一点重新编写测试,或者使用类似@TestMethodOrder(Alphanumeric.class)

      的方法,如果您希望它递增,为什么要调用递减方法?呃,不确定您缺少了什么。对于同一个表达式(
      ai.getAndDecrement()
      ),您同时声明了1和2。其中只有一个是正确的。仅供参考:是的,很抱歉键入错误,
      getAndIncrement
      如果您希望它递增,为什么要调用递减方法?呃,不确定缺少什么。对于同一个表达式(
      ai.getAndDecrement()
      ),您同时声明了1和2。其中只有一个是正确的。参考:是的,很抱歉键入错误,
      getAndIncrement
      很抱歉getAndIncrement,我是指getAndIncrement。您是指整个
      TestTest
      类的新实例吗?与…what…
      AtomicInteger
      的新实例相反?是的,当然是测试类的新实例。是的。好的,我理解,所以每个测试的运行方式就像它是类中唯一的测试一样。通过这种方式,它只测试它应该测试的内容,并且不受其他测试可能导致的任何副作用的影响。对不起getAndIncrement,我是说getAndIncrement。您是指整个
      TestTest
      类的新实例吗?与…what…
      AtomicInteger
      的新实例相反?是的,当然是测试类的新实例。是的。好的,我理解,所以每个测试的运行方式就像它是类中唯一的测试一样。这样一来,它只测试它应该测试的东西,并且对其他测试可能引起的任何副作用免疫。这确实有效。并且也同意让你们的测试互相依赖是一种不好的做法。这确实有效。并且也同意让你们的测试互相依赖是不好的做法。