java - 比较 java unittests 中的两个 hasmaps 列表
问题描述
如何在(java,spring)单元测试中断言这两个哈希图列表相等的最有效方法是什么?
list1 = [{COUNT=5, AUTHOR=William Shakespare}, {COUNT=1, AUTHOR= Mark Helprin}]
list2 = [{AUTHOR=Mark Helprin, COUNT=1}, {AUTHOR=William Shakespare, COUNT=5}]
我正在测试一个 DAO 方法(如果数据库中有 2 本书具有相同的标题,它将计算有多少条目属于哪个作者,并返回一个包含名称和计数的地图列表)
原始 DAO 方法
public List<Map<String, Object>> countQuotesByAuthor(String title) {
return jdbcTemplate.queryForList("SELECT author, COUNT(*) as count FROM Quote WHERE title = ? GROUP BY author",
new Object[] { title });
}
测试方法(不认为 list1 和 list2 相等)
@Test
public void testCountQuotesByAuthor() throws Exception {
List<Map<String, Object>> counts = QuoteDAOImpl.countQuotesByAuthor("Winter's Tale");
for (Map<String, Object> count : counts) {
Object aut = ((String) count.get("AUTHOR")).trim();
count.put("AUTHOR", aut);
}
List<Map<String, Object>> result = new ArrayList<>();
Map<String,Object> shake=new HashMap<>();
shake.put("AUTHOR", "William Shakespeare");
shake.put("COUNT","2");
Map<String,Object> help=new HashMap<>();
help.put("AUTHOR", "Mark Helprin");
help.put("COUNT","1");
result.add(shake);
result.add(help);
Assert.assertTrue(new HashSet<>(result).equals(new HashSet<>(counts)));
}
我收到错误消息
java.lang.AssertionError
at org.junit.Assert.fail(Assert.java:87)
at org.junit.Assert.assertTrue(Assert.java:42)
at org.junit.Assert.assertTrue(Assert.java:53)
at com.quotes.QuoteIntegrationTest.testCountQuotesByAuthor(QuoteIntegrationTest.java:86)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:43)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:82)
at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:73)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:141)
at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:98)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
解决方案
取决于您所说的高效,但如果“高效”意味着“快速实施”,这里有一些快速选项。
如果您知道您没有重复项(一个或另一个列表中有两个相同的映射),您可以将这些列表转换为集合,然后使用等于:
new HashSet<>(list1).equals(new HashSet<>(list2))
如果您知道其中至少有一个不会重复,请另外检查大小是否相同。
如果您可能在两者中都有重复,则可以使用 Guava's MultiSet
s.
推荐阅读
- gcc - 如何在 linux 上的另一个播放器上安装 pip、gcc、python,因为设备已经满了
- python - 如何通过python在windows中连接NexusDB?
- excel - 如何在打开的工作簿中禁用 SaveAs 但不禁用 Save
- javascript - 在 Python 中下载带有回调的 CSV
- java - 如何在java中将“'”转换为“`”
- time - influxdb连续查询的时间偏移不起作用
- html - 如何使移动菜单响应?
- react-native-android - 如何修复“react-native-spinkit:未指定”
- python - 查找每个唯一值的多列模式
- javascript - 无限滚动显示重复结果