5月21日

投稿者: | 2020年5月21日

JUnitテストを使って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());
		mp.addMusic("Official髭男dism", "ノーダウト");
		m = mp.getMusic(1);
		assertNotNull(m);
		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);
		assertEquals("お気に入り", p.getName());
	}
}

テストにパスするように、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(i);
	}

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

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

	public PlayList getPlayList(int i) {
		return playListList.get(0);
	}

}

プレイリストの確認() で2個めのプレイリストを取得するテストを追加。

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

テストを実行するとエラーになる。

テストにパスするように、MusicPlayerを修正する。

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

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

	public PlayList getPlayList(int i) {
		return playListList.get(i);
	}

プレイリストに音楽を追加する機能を、MusicPlayerに追加していきます。
まずはテストコードを追加します。

	@Test
	void プレイリストに音楽を追加する() {
		MusicPlayer mp = new MusicPlayer();
		mp.addPlayList("お気に入り");
		mp.addPlayList("BGM");
		assertEquals(2, mp.countPlayList());
		mp.addMusicToPlayList("お気に入り", "Official髭男dism", "パラボラ");
	}

テストにパスするようにMusicPlayerを実装する。
とりあえず、MusicPlayerに音楽を追加できるようにして、テストにパスするように修正。

	public void addMusicToPlayList(String name, String artist, String title) {
		addMusic(artist, title);
	}

テストを追加する。
プレイリストから音楽を取得してタイトルを確認する。

	@Test
	void プレイリストに音楽を追加する() {
		MusicPlayer mp = new MusicPlayer();
		mp.addPlayList("お気に入り");
		mp.addPlayList("BGM");
		assertEquals(2, mp.countPlayList());
		mp.addMusicToPlayList("お気に入り", "Official髭男dism", "パラボラ");
		int n = mp.countMusic();
		assertEquals(1, n);
		PlayList p = mp.getPlayList(0);
		assertNotNull(p);
		assertEquals("お気に入り", p.getName());
		Music m = p.getMusic(0);
		assertEquals("パラボラ", m.getTitle());
	}

まずはPlayListに複数の音楽を追加するための準備をする。

package jp.abc;

import java.util.List;

public class PlayList {
	private String name;
	private List<Music> musicList;

	public String getName() {
		return name;
	}

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

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

}

プレイリストを名前で検索するする必要があるので、そのメソッドを作るためのテストを作る。

	@Test
	void プレイリストを名前で検索する() {
		MusicPlayer mp = new MusicPlayer();
		mp.addPlayList("お気に入り");
		mp.addPlayList("BGM");
		assertEquals(2, mp.countPlayList());
		PlayList p = mp.getPlayList("BGM");
		assertEquals("BGM", p.getName());
	}

コンパイルエラーを解消するために、プレイリストを名前で検索するメソッドを、MusicPlayerに追加する。

	public PlayList getPlayList(String name) {
		return null;
	}

プレイリストを名前で検索するテストにパスするように、getPlayList()を修正。

	public PlayList getPlayList(String name) {
		for (PlayList p : playListList) {
			if (p.getName().equals(name)) return p;
		}
		return null;
	}

これで、「プレイリストを名前で検索する()」がグリーンになった。
次は、「プレイリストに音楽を追加する()」をグリーンにしたい。

addMusic(artist, title) の戻り値で追加したMusicを返すように修正する。

	public Music addMusic(String artist, String title) {
		Music m = new Music();
		m.setArtist(artist);
		m.setTitle(title);
		musicList.add(m);
		return m;
	}

現在の全体のコードを掲載。

MusicPlayerTest.java

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());
		mp.addMusic("Official髭男dism", "ノーダウト");
		m = mp.getMusic(1);
		assertNotNull(m);
		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);
		assertEquals("お気に入り", p.getName());
		mp.addPlayList("BGM");
		p = mp.getPlayList(1);
		assertEquals("BGM", p.getName());
	}

	@Test
	void プレイリストを名前で検索する() {
		MusicPlayer mp = new MusicPlayer();
		mp.addPlayList("お気に入り");
		mp.addPlayList("BGM");
		assertEquals(2, mp.countPlayList());
		PlayList p = mp.getPlayList("BGM");
		assertEquals("BGM", p.getName());
	}

	@Test
	void プレイリストに音楽を追加する() {
		MusicPlayer mp = new MusicPlayer();
		mp.addPlayList("お気に入り");
		mp.addPlayList("BGM");
		assertEquals(2, mp.countPlayList());
		mp.addMusicToPlayList("お気に入り", "Official髭男dism", "パラボラ");
		int n = mp.countMusic();
		assertEquals(1, n);
		PlayList p = mp.getPlayList(0);
		assertNotNull(p);
		assertEquals("お気に入り", p.getName());
		Music m = p.getMusic(0);
		assertEquals("パラボラ", m.getTitle());
	}
}

MusicPlayer.java

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 Music addMusic(String artist, String title) {
		Music m = new Music();
		m.setArtist(artist);
		m.setTitle(title);
		musicList.add(m);
		return m;
	}

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

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

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

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

	public PlayList getPlayList(int i) {
		return playListList.get(i);
	}

	public PlayList getPlayList(String name) {
		for (PlayList p : playListList) {
			if (p.getName().equals(name)) return p;
		}
		return null;
	}

	public void addMusicToPlayList(String name, String artist, String title) {
		Music m = addMusic(artist, title);
		PlayList p = getPlayList(name);
	}

}

MusicPlayer.javaの以下の部分を修正する。

	public void addMusicToPlayList(String name, String artist, String title) {
		Music m = addMusic(artist, title);
		PlayList p = getPlayList(name);
		p.addMusic(m);
	}

PlayList.java に以下のコードを追加すると、「プレイリストに音楽を追加する()」がグリーンになる。

package jp.abc;

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

public class PlayList {
	private String name;
	private List<Music> musicList = new ArrayList<>();

	public String getName() {
		return name;
	}

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

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

	public void addMusic(Music m) {
		musicList.add(m);
	}

}

新たに「 新規プレイリストに音楽を追加する() 」テストを追加する。

	@Test
	void 新規プレイリストに音楽を追加する() {
		MusicPlayer mp = new MusicPlayer();
		mp.addMusicToPlayList("お気に入り", "Official髭男dism", "パラボラ");
		int n = mp.countMusic();
		assertEquals(1, n);
		n = mp.countPlayList();
		assertEquals(1, n);
	}

addMusic()と同様に、addPlayList()も追加したPlayListを戻り値で返すように修正する。

	public PlayList addPlayList(String name) {
		PlayList pl = new PlayList();
		pl.setName(name);
		playListList.add(pl);
		return pl;
	}

MusicPlayerのaddMusicToPlayList()を修正して、テストをグリーンにする。

	public void addMusicToPlayList(String name, String artist, String title) {
		Music m = addMusic(artist, title);
		PlayList p = getPlayList(name);
		if (p == null) {
			p = addPlayList(name);
		}
		p.addMusic(m);
	}
カテゴリー: TDD