学习Mockito

Mockito支持对变量进行注解,例如将mock对象设为测试类的属性,然后通过注解的方式@Mock来定义它,这样有利于减少重复代码,增强可读性,易于排查错误等。除了支持@Mock,Mockito支持的注解还有@Spy(监视真实的对象),@Captor(参数捕获器),@InjectMocks(mock对象自动注入)。 

Annotation的初始化 
只有Annotation还不够,要让它们工作起来还需要进行初始化工作。初始化的方法为:MockitoAnnotations.initMocks(testClass)参数testClass是你所写的测试类。一般情况下在Junit4的@Before定义的方法中执行初始化工作,如下: 
Java代码  收藏代码
  1. @Before  
  2. public void initMocks() {  
  3.     MockitoAnnotations.initMocks(this);  
  4. }  

除了上述的初始化的方法外,还可以使用Mockito提供的Junit Runner:MockitoJUnitRunner这样就省略了上面的步骤。 
Java代码  收藏代码
  1. @RunWith(MockitoJUnit44Runner.class)  
  2. public class ExampleTest {  
  3.     ...  
  4. }  

@Mock注解 
使用@Mock注解来定义mock对象有如下的优点: 
1. 方便mock对象的创建 
2. 减少mock对象创建的重复代码 
3. 提高测试代码可读性 
4. 变量名字作为mock对象的标示,所以易于排错 

@Mock注解也支持自定义name和answer属性。 
下面是官方给出的@Mock使用的例子: 
Java代码  收藏代码
  1. public class ArticleManagerTest extends SampleBaseTestCase {  
  2.     @Mock   
  3.     private ArticleCalculator calculator;  
  4.     @Mock(name = "dbMock")   
  5.     private ArticleDatabase database;  
  6.     @Mock(answer = RETURNS_MOCKS)   
  7.     private UserProvider userProvider;  
  8.   
  9.     private ArticleManager manager;  
  10.   
  11.     @Before   
  12.     public void setup() {  
  13.         manager = new ArticleManager(userProvider, database, calculator);  
  14.     }  
  15. }  
  16. public class SampleBaseTestCase {  
  17.     @Before   
  18.     public void initMocks() {  
  19.         MockitoAnnotations.initMocks(this);  
  20.     }  
  21. }  

@Spy注解 
Spy的使用方法请参阅前面的章节,在此不再赘述,下面是使用方法: 
Java代码  收藏代码
  1. public class Test{  
  2.     @Spy   
  3.     Foo spyOnFoo = new Foo();  
  4.   
  5.     @Before  
  6.     public void init(){  
  7.        MockitoAnnotations.initMocks(this);  
  8.     }  
  9.     ...  
  10. }  

@Captor注解 
@Captor是参数捕获器的注解,有关用法见前章,通过注解的方式也可以更便捷的对它进行定义。使用例子如下: 
Java代码  收藏代码
  1. public class Test {  
  2.     @Captor  
  3.     ArgumentCaptor<AsyncCallback<Foo>> captor;  
  4.     @Before  
  5.     public void init() {  
  6.         MockitoAnnotations.initMocks(this);  
  7.     }  
  8.   
  9.     @Test  
  10.     public void shouldDoSomethingUseful() {  
  11.         // ...  
  12.         verify(mock.doStuff(captor.capture()));  
  13.         assertEquals("foo", captor.getValue());  
  14.     }  
  15. }  

@InjectMocks注解 
通过这个注解,可实现自动注入mock对象。当前版本只支持setter的方式进行注入,Mockito首先尝试类型注入,如果有多个类型相同的mock对象,那么它会根据名称进行注入。当注入失败的时候Mockito不会抛出任何异常,所以你可能需要手动去验证它的安全性。 
例: 
Java代码  收藏代码
  1. @RunWith(MockitoJUnit44Runner.class)  
  2. public class ArticleManagerTest {  
  3.     @Mock  
  4.     private ArticleCalculator calculator;  
  5.     @Mock  
  6.     private ArticleDatabase database;  
  7.     @Spy  
  8.     private UserProvider userProvider = new ConsumerUserProvider();  
  9.     @InjectMocks  
  10.     private ArticleManager manager = new ArticleManager();  
  11.       
  12.     @Test  
  13.     public void shouldDoSomething() {  
  14.         manager.initiateArticle();  
  15.         verify(database).addListener(any(ArticleListener.class));  
  16.     }  
  17. }  

上例中,ArticleDatabase是ArticleManager的一个属性,由于ArticleManager是注解@InjectMocks标注的,所以会根据类型自动调用它的setter方法为它设置ArticleDatabase。 
原文地址:https://www.cnblogs.com/developer-ios/p/5382302.html