使用 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 就没有这种保证。
尝试使用以下代码测试两个 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 就没有这种保证。