6月1日

投稿者: | 2020年6月1日

「ジュースの種類を増やす」テストの中に「水を購入する」テストが混ざっていたので、テストを分ける。

	@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をステージされた変更の中に異動する。
コミット・メッセージに「最初のコミット」と入力する。
右下の「コミット」をクリックする。