Kap*_*psh 6 java junit hashset
我有一堆返回HashSet的方法.我希望我的单元测试检查这些对象的状态,即确认someObject.getName() == "foobar".
但是,无法保证hashset迭代器顺序,因此我的单元测试失败了一些时间.如何为这样的东西编写单元测试?
例如:
@Test
public void testRowsToBeRead(){
HashSet<SomeObject> rows = new SomeObject().read();
assertEquals(19, rows.size());
for(SomeObject r:rows){
//How do I confirm contents?
}
}
Run Code Online (Sandbox Code Playgroud)
我想我可能很快就会接受答案.
我现在遇到的问题是我已经实现了equals方法,它只检查每个设计对象中的2个字段(它模仿数据库表).但是在我的单元测试中,我想检查所有字段,如描述等,这些不在我的平等中.因此,如果交换了2个字段并且这些字段不在我的equals实现中,那么单元测试会给出误报.
我的做法:
public void testRowsToBeRead(){
HashSet<SomeObject> expectedRows = new HasSet<SomeObject();
expectedRows.add(new SomeObject("abc"));
expectedRows.add(new SomeObject("def"));
HashSet<SomeObject> rows = new SomeObject().read();
// alternative 1
assertEquals(19, rows.size());
for(SomeObject r:rows){
if (!expectedRows.contains(r)) {
// test failed
}
}
// alternative 2
assertTrue(expectedRows.equals(rows));
}
Run Code Online (Sandbox Code Playgroud)
要依赖此测试,您可能需要其他单元测试来确认该SomeObject测试equals 和hashCode方法是否正常工作......
根据您的评论之一进行编辑
如果您想检查不属于equals合同一部分的字段,则必须迭代该集合:
public void testRowsToBeRead(){
HashSet<SomeObject> expectedRows = new HasSet<SomeObject();
expectedRows.add(new SomeObject("a", "a1"));
expectedRows.add(new SomeObject("b", "b1"));
HashSet<SomeObject> rows = new SomeObject().read();
for(SomeObject r : rows) {
SomeObject expected = expectedRows.get(r); // equals and hashCode must still match
if (expected == null) {
// failed
}
if (!expected.getField1().equals(r.getField1()) && !expected.getField2().equals(r.getField2())) {
// failed
}
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,SomeObject它equals可能看起来像这样,它只检查field1:
@Override
public boolean equals(Object other) {
return this.getField1().equals( ((SomeObject) other).getField1() );
}
Run Code Online (Sandbox Code Playgroud)
毫无疑问,根据您的具体用例,这可能会变得更加复杂。希望这可以帮助...
| 归档时间: |
|
| 查看次数: |
6749 次 |
| 最近记录: |