我正在为一个类添加单元测试。这个类有几个构造函数,它们接受不同的类型并将它们转换成一个规范形式,然后可以将其转换成其他类型。
public class Money {
public Money(long l) {
this.value = l;
}
public Money(String s) {
this.value = toLong(s);
}
public long getLong() {
return this.value;
}
public String getString() {
return toString(this.value);
}
}
实际上,它接受并转换了另外几种类型。
我试图找出测试这些构造函数的最合适方法。
是否应该每个构造函数和输出类型都有一个测试:
@Test
public void longConstructor_getLong_MatchesValuePassedToConstructor() {
final long value = 1.00l;
Money m = new Money(value);
long result = m.getLong();
assertEquals(value, result);
}
这导致了很多不同的测试。正如您所看到的,我很难为它们命名。
是否应该有多个断言:
@Test
public void longConstructor_outputsMatchValuePassedToConstructor() {
final long longValue = 1.00l;
final String stringResult = "1.00";
Money m = new Money(longValue);
assertEquals(longValue, m.getLong());
assertEquals(stringResult, m.getString());
}
这里有多个断言,让我感到不舒服。它还测试了getString方法(间接地也测试了toString),但没有在测试名称中说明。给这些命名甚至更难。
我是不是完全错误地关注了构造函数。我应该只测试转换方法吗?但是接下来的测试将错过toLong
方法。
@Test
public void getString_MatchesValuePassedToConstructor() {
final long value = 1.00;
final String expectedResult = "1.00";
Money m = new Money(value);
String result = m.getLong();
assertEquals(expectedResult, result);
}
这是一个遗留的类,我无法更改原始类。