「ジュースの種類を増やす」テストの中に「水を購入する」テストが混ざっていたので、テストを分ける。
@Test
void ジュースの種類を増やす() {
VendingMachine vm = new VendingMachine();
List<Juice> list = vm.getJuiceList();
assertEquals(3, list.size());
}
@Test
void 水を購入できるかどうかを取得する() {
VendingMachine vm = new VendingMachine();
vm.put(50);
boolean b = vm.canBuy("水");
assertEquals(false, b);
vm.put(50);
b = vm.canBuy("水");
assertEquals(true, b);
}
テストにパスするようにVendingMachineを修正する。
public boolean canBuy(String name) {
if (name.equals("水")) {
if (total >= 100) return true;
return false;
}
// 在庫切れはfalseを返す
if (stock == 0) return false;
if (total >= 120) return true;
return false;
}
次はレッドブルを購入できるかどうかを調べるテストを追加する。
@Test
void レッドブルを購入できるかどうかを取得する() {
VendingMachine vm = new VendingMachine();
vm.put(100);
vm.put(50);
boolean b = vm.canBuy("レッドブル");
assertEquals(false, b);
vm.put(50);
b = vm.canBuy("レッドブル");
assertEquals(true, b);
}
テストにパスするようにVendingMachineを修正する。
public boolean canBuy(String name) {
if (name.equals("水")) {
if (total >= 100) return true;
return false;
}
if (name.equals("レッドブル")) {
if (total >= 200) return true;
return false;
}
// 在庫切れはfalseを返す
if (stock == 0) return false;
if (total >= 120) return true;
return false;
}
「水を購入する」テストを追加する。
@Test
void 水を購入する() {
VendingMachine vm = new VendingMachine();
vm.put(100);
Juice j = vm.buy("水");
assertEquals("水", j.getName());
int m = vm.entered();
assertEquals(0, m);
}
テストにパスするようにVendingMachineを修正する。
public Juice buy(String name) {
if (name.equals("水")) {
total -= 100;
return new Juice("水", 100);
}
total -= 120;
stock--;
return new Juice("コーラ", 120);
}
「水を在庫切れにする」テストを追加する。
@Test
void 水を在庫切れにする() {
VendingMachine vm = new VendingMachine();
vm.put(1000);
for (int i = 0; i < 5; i++) {
Juice j = vm.buy("水");
assertEquals("水", j.getName());
}
int m = vm.entered();
assertEquals(500, m);
boolean b = vm.canBuy("水");
assertEquals(false, b);
}
テストにパスするようにVendingMachineを修正する。
public boolean canBuy(String name) {
if (name.equals("水")) {
if (stock == 0) return false;
if (total >= 100) return true;
return false;
}
if (name.equals("レッドブル")) {
if (total >= 200) return true;
return false;
}
// 在庫切れはfalseを返す
if (stock == 0) return false;
if (total >= 120) return true;
return false;
}
public Juice buy(String name) {
if (name.equals("水")) {
total -= 100;
stock--;
return new Juice("水", 100);
}
if (name.equals("レッドブル")) {
total -= 200;
return new Juice("レッドブル", 200);
}
total -= 120;
stock--;
return new Juice("コーラ", 120);
}
変数「stock」上にカーソルを置いて右クリックする。
コンテキストメニューで[リファクタリング]-[名前変更]を選択する。
「stock」を「stockCola」に変更する。→VendingMachineクラス内の「stock」がすべて[stockCola」に変更される!
テストにパスするようにVendingMachineを修正する。
package jp.abc;
import java.util.ArrayList;
import java.util.List;
/**
* 自動販売機クラス
* @author satoshis
*
*/
public class VendingMachine {
private int total = 0;
private int stockCola = 5;
private int stockWater = 5;
/**
* 10円玉、50円玉、100円玉、500円玉、1000円札だけ扱える
* @param money
*/
public void put(int money) {
if (money == 10 || money == 50 || money == 100 || money == 500 || money == 1000) {
total += money;
}
}
public int entered() {
return total;
}
public int refund() {
int r = total;
total = 0;
return r;
}
public List<Juice> getJuiceList() {
List<Juice> list = new ArrayList<>();
list.add(new Juice("コーラ", 120));
list.add(new Juice("レッドブル", 200));
list.add(new Juice("水", 100));
return list;
}
public boolean isStock(String name) {
return true;
}
public boolean canBuy(String name) {
if (name.equals("水")) {
if (stockWater == 0) return false;
if (total >= 100) return true;
return false;
}
if (name.equals("レッドブル")) {
if (total >= 200) return true;
return false;
}
// 在庫切れはfalseを返す
if (stockCola == 0) return false;
if (total >= 120) return true;
return false;
}
public Juice buy(String name) {
if (name.equals("水")) {
total -= 100;
stockWater--;
return new Juice("水", 100);
}
if (name.equals("レッドブル")) {
total -= 200;
return new Juice("レッドブル", 200);
}
total -= 120;
stockCola--;
return new Juice("コーラ", 120);
}
}
「レッドブルを在庫切れにする」テストを追加する。
@Test
void レッドブルを在庫切れにする() {
VendingMachine vm = new VendingMachine();
vm.put(1000);
vm.put(500);
for (int i = 0; i < 5; i++) {
Juice j = vm.buy("レッドブル");
assertEquals("レッドブル", j.getName());
}
int m = vm.entered();
assertEquals(500, m);
boolean b = vm.canBuy("レッドブル");
assertEquals(false, b);
}
テストにパスするようにVendingMachineを修正する。
package jp.abc;
import java.util.ArrayList;
import java.util.List;
/**
* 自動販売機クラス
* @author satoshis
*
*/
public class VendingMachine {
private int total = 0;
private int stockCola = 5;
private int stockWater = 5;
private int stockRedbull = 5;
/**
* 10円玉、50円玉、100円玉、500円玉、1000円札だけ扱える
* @param money
*/
public void put(int money) {
if (money == 10 || money == 50 || money == 100 || money == 500 || money == 1000) {
total += money;
}
}
public int entered() {
return total;
}
public int refund() {
int r = total;
total = 0;
return r;
}
public List<Juice> getJuiceList() {
List<Juice> list = new ArrayList<>();
list.add(new Juice("コーラ", 120));
list.add(new Juice("レッドブル", 200));
list.add(new Juice("水", 100));
return list;
}
public boolean isStock(String name) {
return true;
}
public boolean canBuy(String name) {
if (name.equals("水")) {
if (stockWater == 0) return false;
if (total >= 100) return true;
return false;
}
if (name.equals("レッドブル")) {
if (stockRedbull == 0) return false;
if (total >= 200) return true;
return false;
}
// 在庫切れはfalseを返す
if (stockCola == 0) return false;
if (total >= 120) return true;
return false;
}
public Juice buy(String name) {
if (name.equals("水")) {
total -= 100;
stockWater--;
return new Juice("水", 100);
}
if (name.equals("レッドブル")) {
total -= 200;
stockRedbull--;
return new Juice("レッドブル", 200);
}
total -= 120;
stockCola--;
return new Juice("コーラ", 120);
}
}
リファクタリングしたいので、その準備としてGitでソースコードを管理する。
vendingmachineプロジェクトを右クリックし[チーム]-[プロジェクトの共用]を選択する
「Git」を選択して「次へ」をクリック
「プロジェクトの親フォルダー内のリポジトリーを使用または作成」にチェックする
「リポジトリーの作成」をクリック
「完了」をクリック
パッケージエクスプローラーの右側の縦に3個の○がついたところ「ビュー・メニュー」をクリック。
「フィルター」を選択する。
「.*リソース」のチェックを外す。
「OK」をクリック。
「.settings」フォルダを右クリックして[チーム]-[無視]を選択すると、「.gitignore」ファイルが作られるので、そのファイルを開く。
以下の内容を記載する。
.gitignoreの内容
/.settings/ # Java *.class *.jar *.war *.ear # Eclipse .project .classpath .settings # Idea .idea *.iml *.iws *.ipr # OS Thumbs.db .DS_Store # Gradle .gradle !gradle-wrapper.jar # Maven target # Build out build bin # Other *.log *.swp *.bak
vendingmachineプロジェクトを右クリックする。
[チーム]-[コミット]を選択する。
+が2個重なったアイコンをクリックして.gitignoreとJuice.javaとVendingMachine.javaとVendingMachineTest.javaをステージされた変更の中に異動する。
コミット・メッセージに「最初のコミット」と入力する。
右下の「コミット」をクリックする。