Guest User

Untitled

a guest
Nov 20th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. package fumokmm.test.factory;
  2.  
  3. import java.util.*;
  4. import org.junit.*;
  5. import static org.junit.Assert.*;
  6. import static org.hamcrest.CoreMatchers.*;
  7.  
  8. public class FactoryTest {
  9.  
  10. static abstract class Alphabet {
  11. abstract String whoAmI();
  12. }
  13. static class A extends Alphabet {
  14. @Override String whoAmI() { return "I'm A!"; }
  15. }
  16. static class B extends Alphabet {
  17. @Override String whoAmI() { return "I'm B!"; }
  18. }
  19. static class C extends Alphabet {
  20. @Override String whoAmI() { return "I'm C!"; }
  21. }
  22.  
  23. static interface Animal {}
  24. static class Cat implements Animal {}
  25. static class Dog implements Animal {}
  26.  
  27. static class Factory<T> {
  28. private Map<Class<? extends T>, T> instanceMap =
  29. new HashMap<Class<? extends T>, T>();
  30.  
  31. public <U extends T> U getOrCreate(Class<U> clazz) {
  32. if (! instanceMap.containsKey(clazz)) {
  33. try {
  34. instanceMap.put(clazz, clazz.newInstance());
  35. } catch (InstantiationException e) {
  36. e.printStackTrace();
  37. } catch (IllegalAccessException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. return clazz.cast(instanceMap.get(clazz));
  42. }
  43. }
  44.  
  45. // 以下テスト
  46.  
  47. Factory<Alphabet> factory;
  48.  
  49. @Before
  50. public void setup() {
  51. factory = new Factory<Alphabet>();
  52. }
  53.  
  54. @Test
  55. public void createするテスト() {
  56. A a = factory.getOrCreate(A.class);
  57. assertThat(a instanceof A, is(true));
  58.  
  59. B b = factory.getOrCreate(B.class);
  60. assertThat(b instanceof B, is(true));
  61.  
  62. C c = factory.getOrCreate(C.class);
  63. assertThat(c instanceof C, is(true));
  64. }
  65.  
  66. @Test
  67. public void AlphabetとしてCreateするテスト() {
  68. Alphabet someAlp = factory.getOrCreate(A.class);
  69. assertThat(someAlp.whoAmI(), is("I'm A!"));
  70. assertThat(someAlp instanceof A, is(true));
  71.  
  72. someAlp = factory.getOrCreate(B.class);
  73. assertThat(someAlp.whoAmI(), is("I'm B!"));
  74. assertThat(someAlp instanceof B, is(true));
  75. }
  76.  
  77. @Test
  78. public void Factoryの使い分けのテスト() {
  79. // Animal用のFactory
  80. Factory<Animal> aniFactory = new Factory<Animal>();
  81. aniFactory.getOrCreate(Cat.class);
  82. aniFactory.getOrCreate(Dog.class);
  83.  
  84. //aniFactory.getOrCreate(A.class);
  85. // => コンパイルエラー:aniFactoryは Animal を extends (implements) したクラスのみ生成可能
  86. }
  87.  
  88. @Test
  89. public void インスタンスは同じファクトリ内で使い回されるテスト() {
  90. assertThat("最初はサイズ0", factory.instanceMap.size(), is(0));
  91. A a1 = factory.getOrCreate(A.class);
  92. assertThat("Aを生成&取得", factory.instanceMap.size(), is(1));
  93. factory.getOrCreate(B.class);
  94. assertThat("Bを生成&取得", factory.instanceMap.size(), is(2));
  95. A a2 = factory.getOrCreate(A.class);
  96. assertThat("Aは既に取得済みなので増えない", factory.instanceMap.size(), is(2));
  97. assertSame("同じオブジェクトのはず", a1, a2);
  98. }
  99.  
  100. }
Add Comment
Please, Sign In to add comment