67

Mockito1.9.0を使用しています。メソッドが1回だけ呼び出され、メソッドに渡されたフィールドの1つに特定の値が含まれていることを確認するにはどうすればよいですか?私のJUnitテストでは、

@Before
public void setupMainProg() { 
    // Initialize m_orderSvc, m_opportunitySvc, m_myprojectOrgSvc
    ...
    m_prog = new ProcessOrdersWorker(m_orderSvc, m_opportunitySvc, m_myprojectOrgSvc);
}   // setupMainProg

@Test
public void testItAll() throws GeneralSecurityException, IOException { 
    m_prog.work();  
}

メソッド「work」は、「m_orderSvc」(オブジェクトに渡される引数の1つ)のメソッドを呼び出します。「m_orderSvc」には、メンバーフィールド「m_contractsDao」が含まれています。「m_contractsDao.save」が1回だけ呼び出され、渡された引数に特定の値が含まれていることを確認したいと思います。

これは少し混乱するかもしれません。質問を明確にする方法を教えてください。喜んでそうします。

4

3 に答える 3

69

まず、モックm_contractsDaoを作成して設定する必要があります。クラスがContractsDaoであると仮定すると:

ContractsDao mock_contractsDao = mock(ContractsDao.class);
when(mock_contractsDao.save(any(String.class))).thenReturn("Some result");

次に、モックをm_orderSvcに挿入し、メソッドを呼び出します。

m_orderSvc.m_contractsDao = mock_contractsDao;
m_prog = new ProcessOrdersWorker(m_orderSvc, m_opportunitySvc, m_myprojectOrgSvc);
m_prog.work(); 

最後に、モックが正しく呼び出されたことを確認します。

verify(mock_contractsDao, times(1)).save("Parameter I'm expecting");
于 2012-08-03T21:00:41.257 に答える
28

Mambokingの答えから構築する:

ContractsDao mock_contractsDao = mock(ContractsDao.class);
when(mock_contractsDao.save(anyString())).thenReturn("Some result");

m_orderSvc.m_contractsDao = mock_contractsDao;
m_prog = new ProcessOrdersWorker(m_orderSvc, m_opportunitySvc, m_myprojectOrgSvc);
m_prog.work(); 

引数特定の値が含まれているかどうかを確認するというリクエストに対応すると、引数が文字列であり、文字列引数に部分文字列が含まれているかどうかをテストしたいと考えられます。このためにあなたはすることができます:

ArgumentCaptor<String> savedCaptor = ArgumentCaptor.forClass(String.class);
verify(mock_contractsDao).save(savedCaptor.capture());
assertTrue(savedCaptor.getValue().contains("substring I want to find");

その仮定が間違っていて、への引数がsave()ある種のコレクションである場合、それはわずかに異なるだけです:

ArgumentCaptor<Collection<MyType>> savedCaptor = ArgumentCaptor.forClass(Collection.class);
verify(mock_contractsDao).save(savedCaptor.capture());
assertTrue(savedCaptor.getValue().contains(someMyTypeElementToFindInCollection);

Hamcrestマッチャーの使用方法を知っている場合は、ArgumentMatchersにチェックインすることもできます。

于 2012-08-03T21:25:19.617 に答える
14

これはより良い解決策です:

verify(mock_contractsDao, times(1)).save(Mockito.eq("Parameter I'm expecting"));
于 2016-04-18T07:46:59.563 に答える