【发布时间】:2011-05-26 12:44:22
【问题描述】:
我有一个要添加单元测试的课程。该类有几个构造函数,它们采用不同的类型并将它们转换为规范形式,然后可以转换为其他类型。
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);
}
这是一个遗留类,我不能更改原来的类。
【问题讨论】:
-
拥有多个断言不应该让你感到不舒服——这都是学术性的。如果在实践中它对你有用并且是可维护的,那就去吧。
-
或者考虑参数化测试——一个测试可以测试多个输入值,参数可以包括输入和预期输出。
标签: java unit-testing