2015-08-08 150 views
1

完全陌生的Mockito,這裏是我開始的:爲什麼這個Mockito測試失敗?

類在測試User.java:

package com.test.mockito; 

public class User { 
    private ProductManager productManager; 
    public boolean buy(Product product, int quantity) throws InsufficientProductsException { 
     boolean transactionStatus=false; 
     int availableQuantity = productManager.getAvailableProducts(product); 
     if (quantity < availableQuantity) { 
      throw new InsufficientProductsException(); 
     } 
     productManager.orderProduct(product, quantity); 
     transactionStatus=true; 
     return transactionStatus; 
    } 
    public void setProductManager(ProductManager productManager) { 
     this.productManager = productManager; 
    } 
} 

Mock對象:Product.java

package com.test.mockito; 

public class Product { 
} 

ProductManager.java

package com.test.mockito; 

public interface ProductManager { 
    int getAvailableProducts(Product product); 
    int orderProduct(Product product, int num); 
} 

異常類:InsufficientProductsException.ja va

package com.test.mockito; 

public class InsufficientProductsException extends Exception { 
    private static final long serialVersionUID = 1L; 
} 

最後是測試代碼。

package com.test.mockito; 

import org.junit.Before; 
import org.junit.Test; 
import static org.mockito.Mockito.*; 

public class UserTest { 
    private User user; 
    private ProductManager productManager; 
    private Product product; 
    private int purchaseQuantity = 15; 


    @Before 
    public void setupMock() { 
     user = new User(); 
     productManager = mock(ProductManager.class); 
     user.setProductManager(productManager); 
     product = mock(Product.class); 

    } 

    @Test(expected=InsufficientProductsException.class) 
    public void purchaseButInsufficientAvailableQuantity() throws InsufficientProductsException { 
     int availableQuantity = 3; 
     System.out.println("Train getAvailableProducts(product) to return " + availableQuantity); 
     when(productManager.getAvailableProducts(product)).thenReturn(availableQuantity); 
     try { 
      System.out.println("User.buy(" + purchaseQuantity + ") should fail with InsufficientProductsException"); 
      user.buy(product,purchaseQuantity); 
     } catch (InsufficientProductsException e) { 
      System.out.println("InsufficientProductsException is thrown"); 
      verify(productManager, times(0)).orderProduct(product, purchaseQuantity); 
      System.out.println("Verified orderProduct(product, " + purchaseQuantity + ") is not called"); 
      throw e; 
     } 
    } 

} 

測試失敗,並且它顯示是因爲預期的InsufficientProductsException不是由用戶拋出。 Maven測試報告:

------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 
Running com.test.mockito.UserTest 
Train getAvailableProducts(product) to return 3 
User.buy(15) should fail with InsufficientProductsException 
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 3.66 sec <<< FAILURE! 

Results : 

Failed tests: purchaseButInsufficientAvailableQuantity(com.test.mockito.UserTest): Expected exception: com.test.mockito.InsufficientProductsException 

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0 

這可能看起來很愚蠢,但真的無法通過我做錯了什麼。

回答

6

你有錯誤的檢查方式 - 如果quantity更多availableQuantity,你應該拋出一個異常,而不是更少。

即,應更換此檢查:

if (quantity < availableQuantity) { 
    throw new InsufficientProductsException(); 
} 

有了這一個:

if (quantity > availableQuantity) { 
    throw new InsufficientProductsException(); 
}