使用 JUnit 比较两个 TreeMap

Comparing two TreeMaps with JUnit

尝试使用以下代码测试两个 TreeMap 是否相同:

public class StreamTest {

  private Stream stream;
  private Map<String, AtomicInteger> map = new HashMap<>();

  @Before
  public void setup() {
    stream = new Stream();
    map.put("this", new AtomicInteger(1));
    map.put("is", new AtomicInteger(1));
    map.put("an", new AtomicInteger(1));
    map.put("just", new AtomicInteger(1));
    map.put("example", new AtomicInteger(1));
    map.put("file", new AtomicInteger(1));
    map.put("for", new AtomicInteger(1));
    map.get("this").incrementAndGet();
    map.put("project", new AtomicInteger(1));
  }

  @Test
  public void lineToWordsToMapTest() {
    stream.getLines("testSampleFile");
    Map<String, AtomicInteger> sortedmap = new TreeMap<>(stream.getMap());
    Map<String, AtomicInteger> treemap = new TreeMap<>(map);  // Maps must be sorted in order to pass test
    Assert.assertEquals(treemap, sortedmap);
  }

}

这是令人费解的错误消息:

java.lang.AssertionError: expected: java.util.TreeMap<{an=1, example=1, file=1, for=1, is=1, just=1, project=1, this=2}> but was: java.util.TreeMap<{an=1, example=1, file=1, for=1, is=1, just=1, project=1, this=2}>
Expected :java.util.TreeMap<{an=1, example=1, file=1, for=1, is=1, just=1, project=1, this=2}> 
Actual   :java.util.TreeMap<{an=1, example=1, file=1, for=1, is=1, just=1, project=1, this=2}>

因此使用 JUnit 4.12 时,对象看起来完全一样。任何见解将不胜感激。

那是因为 AtomicInteger 没有覆盖 equals() 并且无法成功地与具有相同值的 AtomicInteger 的其他实例进行比较。您要么需要更改地图值类型,要么为 AtomicInteger.

编写自己的断言

简化:

Assert.assertEquals(new AtomicInteger(1), new AtomicInteger(1));

结果:

java.lang.AssertionError: expected: java.util.concurrent.atomic.AtomicInteger<1> but was: java.util.concurrent.atomic.AtomicInteger<1>
Expected :java.util.concurrent.atomic.AtomicInteger<1> 
Actual   :java.util.concurrent.atomic.AtomicInteger<1>

你有 get() 方法

获取当前值。

Returns: 当前值

AtomicInteger::get保证的是当你调用它的时候,你会得到调用时可用的最新值。例如,普通 int 就没有这种保证。