Customer#statement() の試験

面倒。どーゆーケイスが必要かというと

  • Movie.REGULAR 一件のみ
    • daysRented が 2 以下の場合と 3 以上の場合
  • Movie.NEW_RELEASE 一件のみ
    • daysRented が 2 以上の場合と 1 の場合
  • Movie.CHIOLDRENS 一件のみ
    • daysRented が 3 以下の場合と 4 以上の場合
  • Movie.REGULAR 複数件
  • Movie.NEW_RELEASE 複数件
  • Movie.CHIOLDRENS 複数件
  • Movie.REGULAR と Movie.NEW_RELEASE
  • Movie.NEW_RELEASE と Movie.CHIOLDRENS
  • Movie.CHIOLDRENS と Movie.REGULAR
  • Movie.REGULAR と Movie.NEW_RELEASE と Movie.CHIOLDRENS

しかも文字列が戻ってくるあたりが超微妙。こーゆーケイスって一つの試験で全部 assert するのが良いのかどうか。

とりあえず一つ書いてみた。

	@Test
	public void statementTest() {
		String result1 = "Rental Record for " + name + "\n\t" + "E.T" + "\t" +
				"2.0" + "\n" + "Amount owed is 2.0\n" + "You earned " + "1" +
			" frequent renter points";
		customer = new Customer(name);
		customer.addRental(new Rental(new Movie("E.T", Movie.REGULAR), 2));
		assertEquals(result1, customer.statement());
	}

凄く面倒。これ、テストケース分けた方が良さげ。あと branch してなかったので、

$ git checkout -b test-add

して試験追加続行。

一応できた

以下。全部貼ります。

package jp.co.lexues.study.refactoring;


import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

public class CustomerTest {
	private Customer customer;
	private final String name = "yamanetoshi";

	@Before
	public void setUp() throws Exception {
	}
	
	@Test
	public void getNameTest() {
		customer = new Customer(name);
		assertEquals(name, customer.getName());
	}
	
	@Test
	public void statemanet_REGULAR_one() {
		String result = "Rental Record for " + name + "\n\t" + "E.T" + "\t" + 
			"2.0" + "\n" + "Amount owed is 2.0\n" + "You earned " + "1" +
			" frequent renter points";
		customer = new Customer(name);
		customer.addRental(new Rental(new Movie("E.T", Movie.REGULAR), 2));
		assertEquals(result, customer.statement());
		
		result = "Rental Record for " + name + "\n\t" + "E.T" + "\t" + 
			"3.5" + "\n" + "Amount owed is 3.5\n" + "You earned " + "1" +
			" frequent renter points";
		customer = new Customer(name);
		customer.addRental(new Rental(new Movie("E.T", Movie.REGULAR), 3));
		assertEquals(result, customer.statement());
	}
	
	@Test
	public void statement_NEW_RELEASE_ont() {
		String result = "Rental Record for " + name + "\n\t" + "E.T" + "\t" + 
			"3.0" + "\n" + "Amount owed is 3.0\n" + "You earned " + "1" +
			" frequent renter points";
		customer = new Customer(name);
		customer.addRental(new Rental(new Movie("E.T", Movie.NEW_RELEASE), 1));
		assertEquals(result, customer.statement());
		
		result = "Rental Record for " + name + "\n\t" + "E.T" + "\t" + 
			"6.0" + "\n" + "Amount owed is 6.0\n" + "You earned " + "2" +
			" frequent renter points";
		customer = new Customer(name);
		customer.addRental(new Rental(new Movie("E.T", Movie.NEW_RELEASE), 2));
		assertEquals(result, customer.statement());
	}
	
	@Test
	public void statement_CHILDRENS_one() {
		String result = "Rental Record for " + name + "\n\t" + "E.T" + "\t" + 
			"1.5" + "\n" + "Amount owed is 1.5\n" + "You earned " + "1" +
			" frequent renter points";
		customer = new Customer(name);
		customer.addRental(new Rental(new Movie("E.T", Movie.CHILDRENS), 3));
		assertEquals(result, customer.statement());
	
		result = "Rental Record for " + name + "\n\t" + "E.T" + "\t" + 
			"3.0" + "\n" + "Amount owed is 3.0\n" + "You earned " + "1" +
			" frequent renter points";
		customer = new Customer(name);
		customer.addRental(new Rental(new Movie("E.T", Movie.CHILDRENS), 4));
		assertEquals(result, customer.statement());
		
	}

	@Test
	public void statemanet_REGULAR_multiple() {
		String result = "Rental Record for " + name + "\n" + 
			"\t" + "E.T" + "\t" + "2.0" + "\n" + 
			"\t" + "Toy Story" + "\t" + "3.5" + "\n" + 
			"Amount owed is 5.5\n" + 
			"You earned " + "2" + " frequent renter points";
		customer = new Customer(name);
		customer.addRental(new Rental(new Movie("E.T", Movie.REGULAR), 2));
		customer.addRental(new Rental(new Movie("Toy Story", Movie.REGULAR), 3));
		assertEquals(result, customer.statement());
	}
	
	@Test
	public void statement_NEW_RELEASE_multiple() {
		String result = "Rental Record for " + name + "\n" + 
			"\t" + "E.T" + "\t" + "3.0" + "\n" + 
			"\t" + "Toy Story" + "\t" + "6.0" + "\n" + 
			"Amount owed is 9.0\n" + "You earned " + "3" + " frequent renter points";
		customer = new Customer(name);
		customer.addRental(new Rental(new Movie("E.T", Movie.NEW_RELEASE), 1));
		customer.addRental(new Rental(new Movie("Toy Story", Movie.NEW_RELEASE), 2));
		assertEquals(result, customer.statement());
	}
	
	@Test
	public void statement_CHILDRENS_multiple() {
		String result = "Rental Record for " + name + "\n" + 
			"\t" + "E.T" + "\t" + "1.5" + "\n" + 
			"\t" + "Toy Story" + "\t" + "3.0" + "\n" + 
			"Amount owed is 4.5\n" + "You earned " + "2" + " frequent renter points";
		customer = new Customer(name);
		customer.addRental(new Rental(new Movie("E.T", Movie.CHILDRENS), 3));
		customer.addRental(new Rental(new Movie("Toy Story", Movie.CHILDRENS), 4));
		assertEquals(result, customer.statement());
	}
	
	@Test
	public void statement_REGULAR_and_NEW_RELEASE() {
		String result = "Rental Record for " + name + "\n" + 
			"\t" + "E.T" + "\t" + "3.5" + "\n" + 
			"\t" + "Toy Story" + "\t" + "6.0" + "\n" + 
			"Amount owed is 9.5\n" + "You earned " + "3" + " frequent renter points";
		customer = new Customer(name);
		customer.addRental(new Rental(new Movie("E.T", Movie.REGULAR), 3));
		customer.addRental(new Rental(new Movie("Toy Story", Movie.NEW_RELEASE), 2));
		assertEquals(result, customer.statement());
	}
	
	@Test
	public void statement_NEW_RELEASE_and_CHILDRENS() {
		String result = "Rental Record for " + name + "\n" + 
			"\t" + "E.T" + "\t" + "6.0" + "\n" + 
			"\t" + "Toy Story" + "\t" + "1.5" + "\n" + 
			"Amount owed is 7.5\n" + "You earned " + "3" + " frequent renter points";
		customer = new Customer(name);
		customer.addRental(new Rental(new Movie("E.T", Movie.NEW_RELEASE), 2));
		customer.addRental(new Rental(new Movie("Toy Story", Movie.CHILDRENS), 2));
		assertEquals(result, customer.statement());		
	}
	
	@Test
	public void statement_CHILDRENS_and_REGULAR() {
		String result = "Rental Record for " + name + "\n" + 
			"\t" + "E.T" + "\t" + "1.5" + "\n" + 
			"\t" + "Toy Story" + "\t" + "2.0" + "\n" + 
			"Amount owed is 3.5\n" + "You earned " + "2" + " frequent renter points";
		customer = new Customer(name);
		customer.addRental(new Rental(new Movie("E.T", Movie.CHILDRENS), 2));
		customer.addRental(new Rental(new Movie("Toy Story", Movie.REGULAR), 2));
		assertEquals(result, customer.statement());		
	}
	
	@Test
	public void statement_REGULAR_and_NEW_RELEASE_and_CHILDRENS() {
		String result = "Rental Record for " + name + "\n" + 
			"\t" + "E.T" + "\t" + "3.5" + "\n" + 
			"\t" + "Toy Story" + "\t" + "6.0" + "\n" + 
			"\t" + "Tom & Jerry" + "\t" + "1.5" + "\n" + 
			"Amount owed is 11.0\n" + "You earned " + "4" + " frequent renter points";
		customer = new Customer(name);
		customer.addRental(new Rental(new Movie("E.T", Movie.REGULAR), 3));
		customer.addRental(new Rental(new Movie("Toy Story", Movie.NEW_RELEASE), 2));
		customer.addRental(new Rental(new Movie("Tom & Jerry", Movie.CHILDRENS), 2));
		assertEquals(result, customer.statement());
	}

}

add して commit して patch を関係方面に送付予定。