`
hotdog
  • 浏览: 284913 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

学习Mockito - Mockito对Annotation的支持

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

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

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

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

@Mock注解也支持自定义name和answer属性。
下面是官方给出的@Mock使用的例子:
public class ArticleManagerTest extends SampleBaseTestCase {
    @Mock 
    private ArticleCalculator calculator;
    @Mock(name = "dbMock") 
    private ArticleDatabase database;
    @Mock(answer = RETURNS_MOCKS) 
    private UserProvider userProvider;

    private ArticleManager manager;

    @Before 
    public void setup() {
        manager = new ArticleManager(userProvider, database, calculator);
    }
}
public class SampleBaseTestCase {
    @Before 
    public void initMocks() {
        MockitoAnnotations.initMocks(this);
    }
}

@Spy注解
Spy的使用方法请参阅前面的章节,在此不再赘述,下面是使用方法:
public class Test{
    @Spy 
    Foo spyOnFoo = new Foo();

    @Before
    public void init(){
       MockitoAnnotations.initMocks(this);
    }
    ...
}

@Captor注解
@Captor是参数捕获器的注解,有关用法见前章,通过注解的方式也可以更便捷的对它进行定义。使用例子如下:
public class Test {
    @Captor
    ArgumentCaptor<AsyncCallback<Foo>> captor;
    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void shouldDoSomethingUseful() {
        // ...
        verify(mock.doStuff(captor.capture()));
        assertEquals("foo", captor.getValue());
    }
}

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

上例中,ArticleDatabase是ArticleManager的一个属性,由于ArticleManager是注解@InjectMocks标注的,所以会根据类型自动调用它的setter方法为它设置ArticleDatabase。

分享到:
评论

相关推荐

    Mockito的重要入门资料

    #### Mockito对Annotation的支持 Mockito还支持一些注解来简化mock对象的创建和配置。例如: - `@Mock`:用于创建mock对象。 - `@Spy`:用于创建spy对象。 - `@Captor`:用于创建`ArgumentCaptor`。 通过上述介绍...

    Junit4.12+mockito

    **单元测试**是软件开发过程中的重要环节,它允许开发者对程序的各个模块进行独立验证,确保它们在预期情况下能够正确工作。在这个压缩包中,包含的是两个关键工具:JUnit 4.12 和 Mockito,它们是Java开发中广泛...

    SSH2-Annotation.rar_annotation ssh2_ssh2_ssh2 annotation

    7. **测试与调试**:SSH2-Annotation项目可能还包含了单元测试和集成测试的相关代码,例如使用JUnit或Mockito进行测试,以确保代码的质量和功能的正确性。 8. **最佳实践**:此项目展示了如何在现代Java Web开发中...

    java8stream源码-rpa-em-annotation-app:rpa-em-annotation-app

    em-annotation-app/ ./buildrundm-docker.sh # Run this script to aquire IDAM credentials required for DM API. ./idam.sh 一体化 目前这里有一个 Java 客户端可用: 招摇的用户界面 要查看我们的 REST API,请转...

    spring mvc的简单单元测试

    Spring MVC 提供了对单元测试的良好支持,使得我们可以方便地测试控制器、服务层以及数据访问层。 在Spring MVC中进行单元测试,我们通常会用到以下关键技术和工具: 1. **JUnit**:JUnit是Java编程语言中最常用的...

    java SSH项目 hibernate annotation

    7. **整合与配置**:SSH项目的整合涉及到Spring配置文件中对Struts、Hibernate的配置,以及这三个框架之间的交互。例如,Spring管理Struts的Action,Hibernate的数据源和SessionFactory等。 8. **测试与部署**:在...

    再改struts1.2.*,让struts1再焕发表春,支持Annotation和POJO风格的Action

    2. **Annotation支持**:注解在Java开发中已经成为一种常见的元数据声明方式。通过引入注解,我们可以简化配置,比如在Action类或方法上使用注解来指定请求映射、输入输出结果等,这使得代码更易读,也减少了XML配置...

    java8stream源码-annotation-processor-with-java8-jack-and-jill-android:带有J

    Annotation Processor 的项目。 还要检查库和测试框架是否可以使用它。 首先,确保你知道什么是JACK&JILL。 检查这个。 支持的工具 即时运行 数据绑定( android.dataBinding.enabled = true会失败) 缩小测试(为...

    api-testing-example:演示如何使用Mock MVC实现api测试的示例

    在API测试领域,Mock MVC是Spring框架提供的一种强大的工具,用于模拟Spring MVC应用程序的...通过学习和实践这些示例,你将更好地理解和掌握如何在Java中使用Mock MVC进行API测试,从而提高你的测试技能和代码质量。

    基于java的-67-57-网上书店-源码.zip

    7. **单元测试与集成测试**:Spring Boot支持JUnit和Mockito等测试框架,帮助开发者编写高质量的测试用例,确保代码的稳定性和正确性。 8. **部署与运行**:项目可以通过命令行运行`mvnw`脚本来启动,或者通过构建...

    adapter-annotations-1.0.0-source-release.zip

    【adapter-annotations-1.0.0-source-release.zip】是一个包含源代码的压缩包,主要用于提供`adapter`库的注解支持。这个1.0.0版本是该库的一个发行版,提供了对开发者友好的API和注解,帮助他们在开发过程中更方便...

    成为JۥAVA软件程师需要学哪些参考精选.doc

    - 学习JUnit、Mockito等进行单元测试。 - 熟悉持续集成工具,如Jenkins。 13. **软件工程与项目管理**: - 掌握敏捷开发理念,如Scrum、Kanban。 - 学习需求分析、项目规划和文档编写。 14. **数据库基础**: ...

    148-时间管理系统--源码.zip

    综上所述,"148-时间管理系统--源码.zip"是一个基于Spring Boot的时间管理项目,通过合理的目录结构和强大的框架支持,实现了对时间任务的有效管理。开发者可以通过阅读源代码,学习如何利用Spring Boot构建实际的...

    struts2+spring2+hibernate3 Annotation的整合

    结合JUnit和Mockito,可以对整合后的系统进行单元测试,确保每个组件的正确性。对于Service和DAO层,可以使用内存数据库如HSQLDB来进行快速的集成测试。 9. **部署与优化**: 在实际应用中,需要考虑性能优化,如...

    Junit良葛格学习笔记

    - **IDE支持**:Eclipse、IntelliJ IDEA等主流IDE都提供了内置的JUnit支持,方便编写和运行测试。 - **持续集成**:JUnit与Jenkins、Travis CI等持续集成工具结合,可实现自动化测试和构建。 5. **最佳实践**: ...

    自己整理搜集的一些junit资料 保你满意

    - `提纲.doc`可能包含对JUnit学习的结构化大纲,帮助系统学习。 - `testingandroid-090828164936-phpapp02.pdf`可能是关于Android测试的详细指南,可能涵盖JUnit在Android开发中的实践。 - `Fibonacci.pdf`可能...

    spring-framework-2.5.5

    在Spring 2.5.5中,注解驱动的开发(Annotation-driven development)已经变得非常流行,比如使用`@Autowired`、`@Component`、`@Service`、`@Repository`和`@Controller`等注解,简化了组件扫描和自动装配的过程。...

    Java实用编程技术集锦

    - **注解(Annotation)**:理解注解的作用,如何自定义注解及注解处理器。 - **JNI(Java Native Interface)**:与C/C++等本地代码交互,实现性能优化或调用特定库。 4. **框架篇** - **Spring框架**:学习...

Global site tag (gtag.js) - Google Analytics