我是Java的新手,我正在跟随测试驱动开发实例。在第8章中,我们将法郎和美元的子类严格划分为Money。我已经创建了法郎和美元的工厂方法,但是当我尝试运行测试时,我得到“无法解析符号美元”(或法郎)的测试行:
Money five= new Money.dollar(5);
Money four= new Money.franc(5);
我已经从头开始两次尝试谷歌搜索,但我不确定我错过了什么。
金钱类:
public abstract class Money {
abstract Money times(int multiplier);
protected int amount;
static Money dollar(int amount){
return new Dollar(amount);
}
static Money franc(int amount){
return new Franc(amount);
}
public boolean equals(Object object){
Money money = (Money) object;
return amount == money.amount
&& getClass().equals(money.getClass());
}
}
法郎(美元是一样的):
public class Franc extends Money {
Franc(int amount){
this.amount = amount;
}
Money times(int multiplier){
return new Franc(amount * multiplier);
}
}
测试:
import org.junit.Test;
import static org.junit.Assert.*;
public class MoneyTest {
@org.junit.Test
public void testMultplication(){
Money five= new Money.dollar(5);
assertEquals(new Dollar(10), five.times(2));
assertEquals(new Dollar(15), five.times(3));
Money four= new Money.franc(5);
assertEquals(new Franc(10), four.times(2));
assertEquals(new Franc(15), four.times(3));
}
}
答案 0 :(得分:3)
Money five= new Money.dollar(5);
语法错误。将其更改为:
Money five= Money.dollar(5);
因为new
关键字用于创建实例,但您想要调用静态方法。此外,无法实例化抽象类。
答案 1 :(得分:1)
你正在使用工厂模式;您根本不需要使用new
关键字。
相反,请使用工厂:
Money five= Money.dollar(5);
Money four= Money.franc(5);
我也鼓励对你的对象有特殊性;一个是Dollar
,另一个是Franc
;你应该使用那些实例而不是更抽象的Money
。如果您的子类明显不同(例如,如果Franc
有一个方法来指示它被接受的国家/地区),那么这样做不会对您产生影响。