将两个TreeMaps与JUnit进行比较

时间:2018-04-11 12:57:22

标签: java junit junit4

尝试测试两个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,对象看起来完全一样。任何见解都将不胜感激。

2 个答案:

答案 0 :(得分:2)

这是因为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>

答案 1 :(得分:1)

你有get()方法

获取当前值。

返回: 当前值

AtomicInteger :: get保证,当您调用它时,您将获得呼叫时可用的最新值。例如,你没有普通int的保证。