JUnitとMockについて勉強しています。以下のことを実現したいです。
前提
JUnitを用いて以下のテストクラス:TestTargetService のユニットテストを行います。
このときに、テストクラスで呼び出しているMockTargetServiceクラスのgetAge()メソッドが未完成であるとして
Mock化を行いdoReturn().when()を使用して、getAgeの返却値を強制したいです。
テスト対象のソースコード
Java
1public class TestTargetService { 2 /** 3 * テスト対象のメソッド 4 */ 5 public boolean callService(String gender){ 6 String name = getName(gender); 7 System.out.println("Name:"+name); 8 9 MockTargetService mockServ = new MockTargetService(); 10 int age = mockServ.getAge(); // Mock化したい 11 12 System.out.println("Age:"+age); 13 if(age < 20){ 14 return true; 15 }else{ 16 return false; 17 } 18 } 19 20 private String getName(String gender){ 21 if(gender.equals("男")){ 22 return "Tarou"; 23 }else{ 24 return "Hanako"; 25 } 26 } 27}
Mock対象のソースコード
Java
1public class MockTargetService { 2 /** 3 * 未完成のメソッド 4 */ 5 public int getAge(){ 6 return 20; 7 } 8 9}
###目標・実現したいこと
getAge()の返却値は20ですがMockを用いて強制的に10にして、asserTrue();を成功させたいです。
###期待値
Name:Tarou Age:10 assertTrue成功
###試したこと
以下のテストクラス TestTargetServiceTestでテストを行っているのですがdoReturn()when()で強制した値に変わりません。
Java
1public class TestTargetServiceTest { 2 @InjectMocks 3 TestTargetService testServ = new TestTargetService(); 4 5 @Mock 6 MockTargetService mockServ; 7 @Before 8 public void setUp() { 9 MockitoAnnotations.initMocks(this); 10 } 11 12 @Test 13 public void モックありテスト(){ 14 String gender = "男"; 15 16 //getAge()の返却値を20⇒10に強制したい 17 doReturn(10).when(mockServ).getAge(); 18 boolean res = testServ.callService(gender); 19 assertTrue(res); 20 } 21}
###実際の出力内容・結果
Name:Tarou Age:20 assertTrue失敗
###その他
自分の認識としては
(1)@MockでMockを作成する。
(2)@InjectMocksで作成したMockを使用できるようにする。
(3)@Before内の処理でMockの初期化
(4)テスト対象のメソッド内でMock化したクラスのメソッドが呼ばれたらMock化した内容に切り替わる。
です。
(4)が上手くいかない原因は、Mock化したクラスのインスタンスとテスト対象のメソッド内で呼ばれているインスタンスが違うから切り替わらない?⇒その場合、そもそも実現したいことは行えないということでしょうか???
根本的に何か間違えているようでしたらそのことについてもご教授願いたいです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/16 20:49
2021/10/16 20:52
2021/10/16 21:04