use*_*135 1 java testing junit unit-testing 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;
}
}
Run Code Online (Sandbox Code Playgroud)
模拟对象:Product.java
package com.test.mockito;
public class Product {
}
Run Code Online (Sandbox Code Playgroud)
ProductManager.java
package com.test.mockito;
public interface ProductManager {
int getAvailableProducts(Product product);
int orderProduct(Product product, int num);
}
Run Code Online (Sandbox Code Playgroud)
异常类:InsufficientProductsException.java
package com.test.mockito;
public class InsufficientProductsException extends Exception {
private static final long serialVersionUID = 1L;
}
Run Code Online (Sandbox Code Playgroud)
最后是测试代码.
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
测试失败并显示,因为用户未抛出预期的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
Run Code Online (Sandbox Code Playgroud)
这可能看起来很愚蠢,但实际上无法解决我做错的事情.
你必须检查以错误的方式-你应该抛出一个异常,如果quantity是多比availableQuantity,而不是更少.
即,你应该替换这个检查:
if (quantity < availableQuantity) {
throw new InsufficientProductsException();
}
Run Code Online (Sandbox Code Playgroud)
有了这个:
if (quantity > availableQuantity) {
throw new InsufficientProductsException();
}
Run Code Online (Sandbox Code Playgroud)