单元测试应该使用绝对值吗?

时间:2018-04-15 14:32:35

标签: java unit-testing testing

我参加了一个单元测试,找到了一个在两个类之间进行映射的方法。

@Test
public void testMapping() {
    MappingClass mappingClass = new MappingClass();
    FromClass fromClass = new FromClass("string.value");

    ToClass toClass = mappingClass.map(fromClass);

    //This...
    assertEquals(fromClass.getStringValue(), toClass.getMappedStringValue());
    //... or this?
    assertEquals("string.value", toClass.getMappedStringValue());
}

getter巧合地包含相同的字符串值,我相信代码是这样编写的,因为编写器知道map方法会调用getter。正是由于这个原因,我期望绝对值,因为从TDD的角度来看,你应该不知道实现。

单位测试评估主题的绝对值而不是评估派生值有什么好处?

编辑:为避免混淆,实施方式如下:

public class FromClass {
    private String stringValue;

    public FromClass(String stringValue) {

        this.stringValue = stringValue;
    }

    public String getStringValue() {
        return stringValue;
    }
}

public class ToClass {

    private String mappedStringValue;

    public ToClass(String mappedStringValue) {
        this.mappedStringValue = mappedStringValue;
    }

    public String getMappedStringValue(){
        return mappedStringValue;
    }
}

public class MappingClass {

    public ToClass map(FromClass fromClass){
        return new ToClass(fromClass.getStringValue());
    }
}

1 个答案:

答案 0 :(得分:1)

在这种情况下我会这样做 String expected="string.value";并使用它两次(实际一次,预期一次)我认为它表明意图很好。它表明重用价值不是偶然的,而是预期的。

另外,我认为如果写成

,测试会更具可读性
@Test public void testMapping() {
MappingClass sut= new MappingClass(); //sut=system under test
FromClass fromClass = new FromClass("string.value");

ToClass actual= mappingClass.map(fromClass);
ToClass expected = //construct new object

assertEquals(expected, actual);

这要求在equals对象中执行正确的ToClass。 In此解决方案是针对更改的bullet-prof(ToClass中的新字段)。 为了确保您的equals实现能够防范ToClass中的更改,您可以为equals / hashcode编写另一个测试。如果向ToClass添加新字段,请使用https://github.com/jqno/equalsverifier -your equals test将失败。

值对象(如FromClass, ToClass)中的Equals / hashcode / toString实现是个好主意 - 它使这些类更强大(它们可以是Map中的键,Set中的元素等)并且使用起来很愉快。 / p>