java - 如何在 jUnit 中检查具有双字段的对象的相等性

标签 java junit mockito

我们都知道如何在测试中正确检查小数(使用 TOLERANCE):

class OxygenTankTest {
    static final double TOLERANCE = 0.001;

    @Test
    void testFilling() {
        OxygenTank tank = OxygenTank.withCapacity(100);
        tank.fill(5.8);
        tank.fill(5.6);
        Assertions.assertEquals(0.114, tank.getStatus(), TOLERANCE);
    }
}

但我的问题是如何检查我们是否需要检查的不是单个值 - 而是整个对象。

例如: 需要测试 Summer - 它执行字段求和

public class Summer {
    public void setSum(Item itemTo, Item itemFrom) {
        itemTo.setDiameter(itemTo.getDiameter() + itemFrom.getDiameter());
        itemTo.setLength(itemTo.getLength() + itemFrom.getLength());
    }
}

public class Item {
    private Double diameter;
    private Double length;

    public Item(Double diameter, Double length) {
        this.diameter = diameter;
        this.length = length;
    }

    public Double getDiameter() {
        return diameter;
    }

    public void setDiameter(Double diameter) {
        this.diameter = diameter;
    }

    public Double getLength() {
        return length;
    }

    public void setLength(Double length) {
        this.length = length;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Item item = (Item) o;

        if (diameter != null ? !diameter.equals(item.diameter) : item.diameter != null) return false;
        return length != null ? length.equals(item.length) : item.length == null;
    }

    @Override
    public int hashCode() {
        int result = diameter != null ? diameter.hashCode() : 0;
        result = 31 * result + (length != null ? length.hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("Item{");
        sb.append("diameter=").append(diameter);
        sb.append(", length=").append(length);
        sb.append('}');
        return sb.toString();
    }
}

我如何尝试编写测试:

public class SummerTest {

    @Test
    public void setSum() {
        Summer summer = new Summer();
        Item itemFrom = new Item(2.321, 1.111);
        Item itemTo = new Item(0.999, 0.999);

        summer.setSum(itemFrom, itemTo);

        // expected
        Item expectedItem = new Item(3.32, 2.11);

        assertThat(itemFrom, equalTo(expectedItem));
    }
}

但是这不起作用!

java.lang.AssertionError: 
Expected: <Item{diameter=3.32, length=2.11}>
     but: was <Item{diameter=3.3200000000000003, length=2.11}>
Expected :<Item{diameter=3.32, length=2.11}>

Actual   :<Item{diameter=3.3200000000000003, length=2.11}>
 <Click to see difference>

如何正确检查合规性?

最佳答案

您重写了检查完全相等的equals方法。如果您的对象包含在 equals 实现中考虑的浮点值(float、double),您将不想比较对象本身,而是比较对象内的值:

assertEquals(expected.getDiameter(), itemFrom.getDiameter(), TOLERANCE);
assertEquals(expected.getLength(), itemFrom.getLength(), TOLERANCE);

或者,如果您想变得更奇特,您可以创建自己的 Matcher 并将其放入 assertThat 中。

关于java - 如何在 jUnit 中检查具有双字段的对象的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53933698/

相关文章:

java - Java System.in/out/err 是否始终打开?

java.lang.IllegalStateException : Could not load CacheAwareContextLoaderDelegate unit test spring [Java]

spring - 如何使用 Mockito 测试 Spring Boot 中的 Java 注解 Hibernate 配置类?

java - 如何找到 TIBCO Rendezvous 消息的字节编码?

java - 如何正确映射 JSON 对象?

java - 实体组件系统中的边界和位置

java - 使用 Gradle 运行 JUnit 时设置自定义安全管理器

java - EclipseLink JPA 在关系属性中使用非实体作为目标实体

java - 检查是否未使用 Mockito 调用方法

java - 测试 AWS SNS 实用程序类