`

强大的Mockito测试框架

阅读更多

一.自动生成Mock类
        在需要Mock的属性上标记@Mock注解,然后@RunWith中配置Mockito的TestRunner或者在setUp()方法中显示调用MockitoAnnotations.initMocks(this);生成Mock类即可。

二.自动注入Mock类到被测试类
        只要在被测试类上标记@InjectMocks,Mockito就会自动将标记@Mock、@Spy等注解的属性值注入到被测试类中。

import static org.mockito.Mockito.when;
import java.util.Collections;
import java.util.List;
  
import javax.annotation.Resource;
  
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
importorg.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  
import com.cdai.ssi.user.dao.UserDao;
import com.cdai.ssi.user.domain.UserDomain;
import com.cdai.ssi.user.dto.UserDto;
importcom.cdai.ssi.user.service.UserService;
  
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/spring-config.xml"})
public class UserServiceTest {
         
	@InjectMocks
	@Resource(name= "userService")
	privateUserService userService;
	
	@Mock
	privateUserDao userDao;
	
	@Before
	publicvoid setUp() {
	         MockitoAnnotations.initMocks(this);
	}
	
	@Test
	publicvoid testQueryAll() {
		 when(userDao.selectAll()).thenReturn(Collections.<UserDomain>emptyList());
		 List<UserDto>dtoList = userService.queryAll();
		 Assert.assertTrue(dtoList.isEmpty());
	}     
}

        @InjectMocks的问题是:如果被测试类是代理类,那么注入会失效。比如上面的UserService如果是事务或者其他AOP代理类,那么进入@Test方法时UserService中的DAO属性不会被Mock类替换。

 

三.有些方法想Mock定制,有些想调用真实方法

       因为@Mock针对接口生成Mock类,所以我们是没法调用到真实的实现类的方法。可以使用@Spy注解标注属性,并且标注@Resource注解让Spring注入真实实现类,那么Mockito就会自动生成Spy类。

例如:

@Resource(name = "userService")
privateUserService userService;

@Spy
@Resource
privateUserDao userDao;

        Spy类就可以满足我们的要求。如果一个方法定制了返回值或者异常,那么就会按照定制的方式被调用执行;如果一个方法没被定制,那么调用的就是真实类的方法。

        如果我们定制了一个方法A后,再下一个测试方法中又想调用真实方法,那么只需在方法A被调用前,调用Mockito.reset(spyObject);就行了。

import static org.mockito.Mockito.when;
  
import org.mockito.Mockito;
  
public class TestMockObject implementsITestMock {
  
         publicstatic void main(String[] args) {
                   
                   ITestMockmock = Mockito.mock(TestMockObject.class);
                   System.out.println(mock.test1());
                   System.out.println(mock.test2());
                   
                   ITestMockspy = Mockito.spy(new TestMockObject());
                   System.out.println(spy.test1());
                   System.out.println(spy.test2());
                   
                   when(spy.test1()).thenReturn(100);
                   System.out.println(spy.test1());
                   
                   Mockito.reset(spy);
                   System.out.println(spy.test1());
                   System.out.println(spy.test2());
                   
                   when(spy.test1()).thenReturn(104);
                   System.out.println(spy.test1());
         }
  
         @Override
         publicint test1() {
                   System.out.print("RealTest1()!!! - ");
                   return1;
         }
  
         @Override
         publicint test2() {
                   System.out.print("RealTest2()!!! - ");
                   return2;
         }
}

        输出为:

0
0
Real Test1()!!! - 1
Real Test2()!!! - 2
Real Test1()!!! - 100
Real Test1()!!! - 1
Real Test2()!!! - 2
Real Test1()!!! - 104
分享到:
评论

相关推荐

    spring集成TestNG与Mockito框架单元测试方法.pdf

    Spring集成TestNG与Mockito框架单元测试方法的文档详细介绍了如何在Java Spring项目中,利用TestNG和Mockito框架进行单元测试。这种测试方法可以帮助开发者快速上手单元测试,并确保代码质量。文档涉及了多个方面,...

    spring集成TestNG与Mockito框架单元测试方法

    TestNG是一个强大的测试框架,它扩展了JUnit的功能,提供了更灵活的测试配置,如并发测试、更丰富的注解、更详尽的测试报告等。首先,你需要在你的项目中引入TestNG的依赖。在Maven项目中,可以在pom.xml文件中添加...

    java自动化测试框架

    Java自动化测试框架是软件开发过程中不可或缺的一部分,它能够帮助开发者高效、准确地验证代码功能,提高软件质量。本文将深入探讨Java自动化测试框架的核心概念、常用工具以及如何构建一个基本的自动化测试流程。 ...

    基于Springboot+Mybatis打造接口自动化测试框架-全网最新最全最具技术含量的接口自动化测试及框架编写

    在构建一个基于Springboot+Mybatis的接口自动化测试框架时,我们需要深入了解这两个核心技术和接口测试的基本原理。Springboot以其简洁的配置和快速的开发能力,成为现代Java Web应用的首选框架,而Mybatis则提供了...

    android测试框架

    另外,TestNG是另一个强大的测试框架,它在JUnit的基础上增加了更多功能,如多线程测试、参数化测试、依赖性管理和更灵活的测试套件结构。它可以与Android测试框架结合使用,提升测试的效率和覆盖率。 最后,持续...

    单元测试框架深入与分享

    单元测试框架深入与分享 在软件开发中,单元测试是保证代码质量的重要步骤。单元测试框架是实现单元测试的基础设施,本文将深入讨论单元测试框架的原理、实现和最佳实践。 单元测试的定义 单元测试是指对软件中...

    Mockito+Junit5测试方法实践

    内容概要:参考Mockito官方API文档,实践框架每个特性。 适合人群:Mockito入门人员以及想全面熟悉Mockito特性的人员,做到了开箱即用。 能学到什么:“Mockito 4.6.0 + Junit 5”的组合编程。 使用建议:使用前安装...

    Java单元测试框架Demo

    我们将主要关注Junit和Mockito这两个流行的Java单元测试框架。 Junit是Java领域最常用的单元测试框架,它提供了丰富的注解和断言方法,使得编写测试用例变得简单直观。例如,我们可以使用`@Test`注解来标记一个方法...

    模拟测试框架Mockito简明教程

    Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建...

    Junit + Hamcrest + Mockito 单元测试 Jar包

    本资源包含的"Junit + Hamcrest + Mockito 单元测试 Jar包"是一个用于Java应用程序单元测试的工具集合,分别对应了三个流行的测试框架:JUnit、Hamcrest和Mockito。 JUnit是一个开源的Java单元测试框架,广泛应用于...

    Android-全面的android应用单元测试方法及案例

    在Android应用开发中,单元...Junit提供基础测试框架,Mockito帮助我们模拟对象,而Robolectric则实现了Android环境的模拟。通过这三者的结合,我们可以有效地测试MVP架构中的每个部分,从而提高代码质量和软件稳定性。

    mockito-1.9.5.zip

    Mockito 是一个流行的Java单元测试框架,用于模拟对象行为,使得测试更为简洁和可控。JUnit则是最常用的Java单元测试库,它提供了一种结构化的方式来编写和运行测试用例。当我们进行单元测试时,Mockito 和 JUnit ...

    PowerMock+Mockito-junit测试套件1.6.3版本

    PowerMock和Mockito是两个非常流行的Java单元测试框架,结合JUnit,它们可以提供强大的测试能力。在本文中,我们将深入探讨"PowerMock+Mockito-junit测试套件1.6.3版本"中的关键概念、功能和使用方法。 **PowerMock...

    WebUI自动化测试框架

    总的来说,"WebUI自动化测试框架"结合了Selenium的强大功能和Java的灵活性,为Web应用测试提供了高效、可扩展的解决方案。通过定制化的元素描述文件和数据源,测试人员可以专注于测试逻辑,而不是复杂的编程细节,...

    【mockito实战】mockito+junit搞定单元测试,包含测试代码及被测试项目

    Mockito 是一个流行的 Java 单元测试框架,它允许开发者创建和配置模拟对象,以便在测试中隔离被测试代码。JUnit 是一个广泛使用的 Java 测试框架,它为编写和运行可重复的单元测试提供了基础。将 Mockito 和 JUnit ...

    面向程序员的Java测试框架.zip

    掌握JUnit后,开发者可以进一步探索其他的Java测试框架,如TestNG,它提供了更灵活的测试配置和更强大的报告功能,或者Mockito,一个用于模拟对象的库,使测试更加隔离和可控。 在实际项目中,测试框架通常与其他...

    JUnitGuiceMockito高效组合测试框架

    当我们把这三个工具高效地结合起来,就可以构建出一个强大的测试框架,以提高测试效率和代码覆盖率。 `JUnit` 是 Java 语言中最流行的一种单元测试框架,它允许开发者编写可重复执行的测试用例,用于验证代码的各个...

    junit4 jar包 Java单元测试框架绿色免费版.zip

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了一种方便、高效的方式来验证代码的正确性。这个“junit4 jar包 Java单元测试框架绿色免费版.zip”文件包含的是JUnit4框架的可执行jar包,用于...

    Test-Driven-Development-with-Mockito_2013-11

    本文档标题为《Test-Driven-Development-with-Mockito_2013-11》,从标题可以得知本文涉及的知识点主要关于测试驱动开发(Test-Driven Development,简称TDD)和Mockito测试框架的实践应用。Sujoy Acharya是本书的...

Global site tag (gtag.js) - Google Analytics