zoukankan      html  css  js  c++  java
  • 学习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。 
  • 相关阅读:
    state estimation for robotics-1
    Linux命令----用户目录、路径
    Linux命令----系统目录结构
    Linux命令----shell
    socket php
    深入浅出讲解:php的socket通信 转
    phpstorm配置sftp自动上传
    linux下xdebug的安装和配置方法
    xdebug安装
    swoole 客户端和服务端不断通信
  • 原文地址:https://www.cnblogs.com/developer-ios/p/5382302.html
Copyright © 2011-2022 走看看