40442


いつもお世話になっております。  
掲題についてご相談させてください。  
以下のようなソースコードがあったとします。

試験対象のコード

[code]

    public class テスト対象のクラス{
    　　@Inject
        private モック化したいクラス セッション;
    　　　　
        public boolean テスト対象のメソッド(){
             // ...適当な処理...
             セッション.getMap().put("テストKey", "テストValue");
             // ...適当な処理...
             return true;
        }
    }
    
    public class モック化したいクラス{
        private Map<String, String> 試験対象のマップ;
        public Map<String, String> getMap(){
            return 試験対象のマップ;
        }
    }
    
[/code]

テストの実行コード

[code]

    //...
    import org.mockito.Mock; // テスト用ライブラリとしてMockitoを使用
    //...
    public class テスト対象のクラスTest{
    
        /**
         * テスト対象のクラス
         */
        @Inject
        @InjectMocks
        テスト対象のクラス service;
    
        // モック用
        モック化したいクラス モックインスタンス = mock(モック化したいクラス.class);
    
        @Before
        public void setUp() {
            // モックを有効にする
            MockitoAnnotations.initMocks(this);
        }
    
        @Test
        public void テスト() {
            // 戻り値のテストはOK
            assertThat(test, is(service.テスト対象のメソッド()));
    
    　　    // モックを呼び出した時に、
            // 試験対象のマップの検証はどうすればよいでしょうか。
           // verify()?
           // argumentcaptor?
        }
    
    }
    
[/code]

上記処理の通り、途中でセッションにつめた変数の内容を検証したいのですが、  
何かいい方法はないでしょうか。

皆様のお知恵をお借りできれば幸いです。  
よろしくお願い致します。


CC BY-SA 3.0
2017-10-05T04:50:37.790
38456
2017-12-21T08:17:41.123
2904
question
java junit
JUnitで、モック化したインスタンスの中のprivate fieldの内容を検証したい


`モック化したいクラス#getMap()`メソッドで返されるインスタンスを検証できるように、自前で用意した(=テストコード側で用意した)インスタンスを返すようにすれば良いです。  
Mockitoでは次のように書けます([ドキュメント](https://static.javadoc.io/org.mockito/mockito-
core/2.13.0/org/mockito/Mockito.html#stubbing))。

[code]

    when(モックインスタンス.getMap()).thenReturn(map);
    
[/code]

テストコード全体としては、次のようになります:

[code]

    public class テスト対象のクラスTest {
    
        @Inject
        @InjectMocks
        テスト対象のクラス service;
    
        @Mock
        private モック化したいクラス モックインスタンス;
    
        private Map<String, String> map;
    
        @Before
        public void setUp() {
            MockitoAnnotations.initMocks(this);
    
            map = new HashMap<String, String>();
            when(モックインスタンス.getMap()).thenReturn(map);
        }
    
        @Test
        public void テスト() {
            assertThat(true, is(service.テスト対象のメソッド()));
    
            assertEquals(1, map.keySet().size());
            assertEquals("テストKey", map.keySet().iterator().next());
            assertEquals("テストValue", map.values().iterator().next());
        }
    }
    
[/code]


CC BY-SA 3.0
2017-12-21T08:17:41.123
40442
2017-12-21T08:17:41.123
2808
38456
answer