我正努力自学Mockito。
考虑以下方法, hasInventory(),它不应该以我的思维方式运行,而是设置为返回 true 或 false < / em>当我松鼠笼罩我的测试。类仓库是我的“模拟依赖”。
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 被抛出。 mocked依赖类中还有其他方法,例如 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(),而只是返回 true 而不是在我测试类时调用它(“systemUnderTest”)。任何人都可以帮助我克服这一点(或者对我的大脑有所了解)吗?
我正在关联 mockito-all-1.8.5.jar 和JUnit 4.
非常感谢所有阅读此内容的人。
拉斯
答案 0 :(得分:10)
Mockito无法模拟final
类或方法。尝试从final
方法中删除hasInventory
修饰符。或者更好的是,不要模拟Warehouse
类,而是模拟IWarehouse
接口,其方法不能是final
,并且可能定义Order
使用的接口。
一般来说,最好是模拟接口,但这不是强制性的。
在Mockito FAQ中简要提到了无法模拟final
类或方法,这是由于用于创建模拟的运行时类生成技术。