首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AtomicInteger在JUnit测试中不会增加

AtomicInteger在JUnit测试中不会增加
EN

Stack Overflow用户
提问于 2018-03-13 08:16:20
回答 3查看 1.6K关注 0票数 0

我有下面的JUnit测试,并且无法计算为什么第二个测试没有通过,在这两个测试中,i的值都是1。

代码语言:javascript
运行
复制
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 passes和test2在以下消息中失败:

代码语言:javascript
运行
复制
java.lang.AssertionError: 
Expected :2
Actual   :1
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-13 08:18:51

这些测试是在新实例上运行的。test1()的行为不会以任何方式影响test2(),否则它可能导致单个失败的测试失败,所有其他测试都会随之失败。这会使你更难找出问题的根源,而你不想这样做。

如果您想测试多个调用之间的行为,您需要创建一个测试,将这两个方法作为一个单元一起调用,或者继续进行集成测试,在那里您可以测试更多的代码以确保正确工作。

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

票数 5
EN

Stack Overflow用户

发布于 2018-03-13 08:38:56

  • 每个@Test注释的方法使用新的重新初始化的ai值(1)运行索引,因此test2失败。
  • 最好在一个测试中运行test1test2,以检测正确的工作getAndIncrement()结果(属于实际问题)。看一看代码列出的Ai-增量。 //*代码清单: ai -递增*私有AtomicInteger ai;@ public (){ai=新的AtomicInteger(1);}} @ Test () { assertEquals(1,ai.getAndIncrement();assertEquals(2,ai.getAndIncrement());}
  • 此外,您可以使用@Before而不是private AtomicInteger ai = new AtomicInteger(1);。因此,您可以确保每个测试的赋值1都是原子的。
票数 1
EN

Stack Overflow用户

发布于 2021-06-17 11:54:33

您可以在AtomicInteger初始化中添加“静态”,每个测试实例都将使用相同的变量。如下所示:

代码语言:javascript
运行
复制
private static AtomicInteger ai = new AtomicInteger(1);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49251258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档