我正在努力学习Mockito。
考虑以下方法hasInventory(),根据我的想法,它不应该真正运行,而是设置为根据我的测试返回true或false。类Warehouse是我的“模拟依赖项”。
public class Warehouse implements IWarehouse
{
private Map< String, Integer > inventory;
public Warehouse()
{
this.inventory = new HashMap< String, Integer >();
}
public final boolean hasInventory( String itemname, int quantity )
throws InventoryDoesNotExistException
{
if( inventory == null )
throw new InventoryDoesNotExistException();
if( !inventory.containsKey( itemname ) )
return false;
int current = ( inventory.containsKey( itemname ) ) ? inventory.get( itemname ) : 0;
return( current >= quantity );
}
...
在JUnit测试代码中,第一个when()抛出异常,因为它按字面意义解释方法调用(执行它),并且由于inventory为nil(参见上文),所以会抛出InventoryDoesNotExistException。模拟依赖类中还有其他方法,例如add()和remove()。
@RunWith( MockitoJUnitRunner.class )
public class OrderInteractionTest
{
private static final String TALISKER = "Talisker";
private Order systemUnderTest = null;
@Mock
private Warehouse mockedDependency = null;
@Before
public void init()
{
//MockitoAnnotations.initMocks( this );
//mockedDependency = mock( Warehouse.class );
this.systemUnderTest = new Order( TALISKER, 50 );
}
@Test
public void testFillingRemovesInventoryIfInStock()
{
try
{
doNothing().doThrow( new RuntimeException() ).when( mockedDependency ).add( anyString(), anyInt() );
doNothing().doThrow( new RuntimeException() ).when( mockedDependency ).remove( anyString(), anyInt() );
when( mockedDependency.hasInventory( anyString(), anyInt() ) ).thenReturn( true );
when( mockedDependency.getInventory( anyString() ) ).thenReturn( 50 );
据我的理解,通过使用when()方法,我要求Mockito不要调用hasInventory(),而只是在测试这个类(“systemUnderTest”)时返回true。有没有人能帮助我跨越这一点(或让我的大脑感到些许意义)?
我链接了mockito-all-1.8.5.jar和JUnit 4。
感谢所有阅读此内容的人。
Russ