5月18日

投稿者: | 2020年5月18日

MusicPlayerをテスト駆動開発で作成してみます。

まずはMusicPlayerクラスを作成。

package jp.abc;

public class MusicPlayer {

}

MusicPlayerクラスを右クリックし、[新規]-[その他]を選択。
フィルターに「ju」を入力すると残り2個になるので、「JUnitテストケース」を選択し「OK」をクリック。
MusicPlayerTestクラスに以下のコードを記述する。
MusicPlayerTestクラスを右クリックし[実行]-[JUnitテスト]を選択すると、テストが実行される。

package jp.abc;

import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class MusicPlayerTest {

	@Test
	void 音楽を追加する() {
		MusicPlayer mp = new MusicPlayer();
		mp.addMusic("Official髭男dism", "パラボラ");
		int n = mp.countMusic();
		assertEquals(1, n);
	}

}

Eclipseのクイックフィックスを使用してMusicPlayerクラスのメソッドを生成する。

package jp.abc;

public class MusicPlayer {

	public void addMusic(String artist, String title) {
		// TODO 自動生成されたメソッド・スタブ

	}

	public int countMusic() {
		return 0;
	}

}

このコードを書いた状態でテストを実行すると、結果が赤になる。

ここで、Fakeと言われているコードを記述する。

package jp.abc;

public class MusicPlayer {

	public void addMusic(String artist, String title) {
		// TODO 自動生成されたメソッド・スタブ

	}

	public int countMusic() {
		return 1;
	}

}

countMusic()の戻り値を1にすると、テスト結果がグリーンになる。

テストを追加する。

package jp.abc;

import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class MusicPlayerTest {

	@Test
	void 音楽を追加する() {
		MusicPlayer mp = new MusicPlayer();
		mp.addMusic("Official髭男dism", "パラボラ");
		int n = mp.countMusic();
		assertEquals(1, n);
		mp.addMusic("Official髭男dism", "ノーダウト");
		n = mp.countMusic();
		assertEquals(2, n);
	}

}

テストを追加すると、実行結果が赤になる。

きちんと実装していくために、Musicクラスを作成する。

package jp.abc;

public class Music {
	private String artist;
	private String title;
	public String getArtist() {
		return artist;
	}
	public void setArtist(String artist) {
		this.artist = artist;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
}

Musicクラスを作ったら、MusicPlayerクラスの実装を追加する。

package jp.abc;

import java.util.ArrayList;
import java.util.List;

public class MusicPlayer {
	private List<Music> musicList = new ArrayList<>();
	public void addMusic(String artist, String title) {
		Music m = new Music();
		m.setArtist(artist);
		m.setTitle(title);
		musicList.add(m);
	}

	public int countMusic() {
		return musicList.size();
	}

}

countMusic() で musicList.size() を返すことで、テストにパスする実装ができ、テストがグリーンになる。

テストを追加する。

package jp.abc;

import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class MusicPlayerTest {

	@Test
	void 音楽を追加する() {
		MusicPlayer mp = new MusicPlayer();
		mp.addMusic("Official髭男dism", "パラボラ");
		int n = mp.countMusic();
		assertEquals(1, n);
		mp.addMusic("Official髭男dism", "ノーダウト");
		n = mp.countMusic();
		assertEquals(2, n);
	}

	@Test
	void 追加した音楽の確認() {
		MusicPlayer mp = new MusicPlayer();
		mp.addMusic("Official髭男dism", "パラボラ");
		Music m = mp.getMusic(0);
		assertNotNull(m);
	}
}

getMusic()がコンパイルエラーになるので、クイックフィックスでメソッドを追加する。

package jp.abc;

import java.util.ArrayList;
import java.util.List;

public class MusicPlayer {
	private List<Music> musicList = new ArrayList<>();
	public void addMusic(String artist, String title) {
		Music m = new Music();
		m.setArtist(artist);
		m.setTitle(title);
		musicList.add(m);
	}

	public int countMusic() {
		return musicList.size();
	}

	public Music getMusic(int i) {
		// TODO 自動生成されたメソッド・スタブ
		return null;
	}

}

テストでエラーになるので、nullではなくFakeのコードとして new Music() を返す。

package jp.abc;

import java.util.ArrayList;
import java.util.List;

public class MusicPlayer {
	private List<Music> musicList = new ArrayList<>();
	public void addMusic(String artist, String title) {
		Music m = new Music();
		m.setArtist(artist);
		m.setTitle(title);
		musicList.add(m);
	}

	public int countMusic() {
		return musicList.size();
	}

	public Music getMusic(int i) {
		return new Music();
	}

}

テストでアーティストとタイトルを確認するコードを追加する。

package jp.abc;

import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class MusicPlayerTest {

	@Test
	void 音楽を追加する() {
		MusicPlayer mp = new MusicPlayer();
		mp.addMusic("Official髭男dism", "パラボラ");
		int n = mp.countMusic();
		assertEquals(1, n);
		mp.addMusic("Official髭男dism", "ノーダウト");
		n = mp.countMusic();
		assertEquals(2, n);
	}

	@Test
	void 追加した音楽の確認() {
		MusicPlayer mp = new MusicPlayer();
		mp.addMusic("Official髭男dism", "パラボラ");
		Music m = mp.getMusic(0);
		assertNotNull(m);
		assertEquals("Official髭男dism", m.getArtist());
		assertEquals("パラボラ", m.getTitle());
	}
}

Fake実装なので、テストがエラーになる。

getMusic() をきちんと実装すると、テストにパスする。

package jp.abc;

import java.util.ArrayList;
import java.util.List;

public class MusicPlayer {
	private List<Music> musicList = new ArrayList<>();
	public void addMusic(String artist, String title) {
		Music m = new Music();
		m.setArtist(artist);
		m.setTitle(title);
		musicList.add(m);
	}

	public int countMusic() {
		return musicList.size();
	}

	public Music getMusic(int i) {
		return musicList.get(0);
	}

}

MusicPlayerにプレイリストの機能を追加する。

package jp.abc;

import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class MusicPlayerTest {

	@Test
	void 音楽を追加する() {
		MusicPlayer mp = new MusicPlayer();
		mp.addMusic("Official髭男dism", "パラボラ");
		int n = mp.countMusic();
		assertEquals(1, n);
		mp.addMusic("Official髭男dism", "ノーダウト");
		n = mp.countMusic();
		assertEquals(2, n);
	}

	@Test
	void 追加した音楽の確認() {
		MusicPlayer mp = new MusicPlayer();
		mp.addMusic("Official髭男dism", "パラボラ");
		Music m = mp.getMusic(0);
		assertNotNull(m);
		assertEquals("Official髭男dism", m.getArtist());
		assertEquals("パラボラ", m.getTitle());
	}
	
	@Test
	void プレイリストを作る() {
		MusicPlayer mp = new MusicPlayer();
		mp.addPlayList("お気に入り");
	}
}

プレイリストを作るために、PlayListクラスを作成する。

package jp.abc;

public class PlayList {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

MusicPlayerにプレイリストの実装を追加する。

package jp.abc;

import java.util.ArrayList;
import java.util.List;

public class MusicPlayer {
	private List<Music> musicList = new ArrayList<>();
	private List<PlayList> playListList = new ArrayList<>();
	public void addMusic(String artist, String title) {
		Music m = new Music();
		m.setArtist(artist);
		m.setTitle(title);
		musicList.add(m);
	}

	public int countMusic() {
		return musicList.size();
	}

	public Music getMusic(int i) {
		return musicList.get(0);
	}

	public void addPlayList(String name) {
		playListList.add(new PlayList());
	}

	public int countPlayList() {
		return playListList.size();
	}

}

プレイリストを確認するテストを追加する。

package jp.abc;

import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class MusicPlayerTest {

	@Test
	void 音楽を追加する() {
		MusicPlayer mp = new MusicPlayer();
		mp.addMusic("Official髭男dism", "パラボラ");
		int n = mp.countMusic();
		assertEquals(1, n);
		mp.addMusic("Official髭男dism", "ノーダウト");
		n = mp.countMusic();
		assertEquals(2, n);
	}

	@Test
	void 追加した音楽の確認() {
		MusicPlayer mp = new MusicPlayer();
		mp.addMusic("Official髭男dism", "パラボラ");
		Music m = mp.getMusic(0);
		assertNotNull(m);
		assertEquals("Official髭男dism", m.getArtist());
		assertEquals("パラボラ", m.getTitle());
	}

	@Test
	void プレイリストを作る() {
		MusicPlayer mp = new MusicPlayer();
		mp.addPlayList("お気に入り");
		int n = mp.countPlayList();
		assertEquals(1, n);
	}

	@Test
	void プレイリストの確認() {
		MusicPlayer mp = new MusicPlayer();
		mp.addPlayList("お気に入り");
		PlayList p = mp.getPlayList(0);
		assertNotNull(p);
	}
}

コンパイルエラーを解消するために、MusicPlayerに getPlayList() を追加する。

package jp.abc;

import java.util.ArrayList;
import java.util.List;

public class MusicPlayer {
	private List<Music> musicList = new ArrayList<>();
	private List<PlayList> playListList = new ArrayList<>();
	public void addMusic(String artist, String title) {
		Music m = new Music();
		m.setArtist(artist);
		m.setTitle(title);
		musicList.add(m);
	}

	public int countMusic() {
		return musicList.size();
	}

	public Music getMusic(int i) {
		return musicList.get(0);
	}

	public void addPlayList(String name) {
		playListList.add(new PlayList());
	}

	public int countPlayList() {
		return playListList.size();
	}

	public PlayList getPlayList(int i) {
		return null;
	}

}
カテゴリー: TDD