`
xiahaihuje
  • 浏览: 9296 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Mockito+Spring集成单元测试

阅读更多

首先,我的问题是:有一长串的数据处理流程,在最后一部分的处理中需要调另一个平台的接口并依赖该接口的返回做剩下的处理,而本地自己单元测试调不到。(不要说将接口返回参数直接写死,这样不太好,虽然我在没有使用 Mockito 时就是这样做的。)既然已经接触了 Mockito 那就用它来解决问题。

 

不了解 Mockito 是什么?没关系,看看这篇:http://liuzhijun.iteye.com/blog/1512780

 

我准备了一些有趣的类来完成我的测试:OrderCreate.java,OrderHelper.java,MockSpringTest.java。

package com.practice.mock

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * mock 测试准备类
 *
 * @author tiger
 * @version 1.0.0 createTime: 14/12/27 下午8:57
 * @see com.practice.mock.OrderHelper
 * @since 1.6
 */
@Component
public class OrderCreate {

    @Autowired
    private OrderHelper orderHelper;

    public void create() {
        System.out.println(getAmt());
        System.out.println(orderHelper.resolve());
    }

    public int getAmt() {
        return 10;
    }
}

 

package com.practice.mock;

import org.springframework.stereotype.Component;

/**
 * mock 测试准备类
 *
 * @author tiger
 * @version 1.0.0 createTime: 14/12/27 下午8:59
 * @since 1.6
 */
@Component
public class OrderHelper {

    public String resolve() {
        return "resolve order";
    }
}

 

package com.practice.mock;

import com.practice.mock.BaseSpringTest;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.util.ReflectionTestUtils;

import static org.mockito.Mockito.*;

/**
 * mock 测试
 *
 * <p>spinrg + mock 测试的例子
 *
 * @author tiger
 * @version 1.0.0 createTime: 15-1-8 下午5:07
 * @since 1.6
 */
public class MockSpringTest extends BaseSpringTest {

    @InjectMocks
    private OrderCreate orderCreate = mock(OrderCreate.class);

    @Mock
    private OrderHelper orderHelper;

    @Before
    public void initMocks() throws Exception {
        MockitoAnnotations.initMocks(this);
        doReturn(11).when(orderCreate).getAmt();
        doReturn("success").when(orderHelper).resolve();
        doCallRealMethod().when(orderCreate).create();
    }

    @Test
    public void create() {
        System.out.println("start mock...");
        orderCreate.create();
    }
}

 

输出的结果是:

start mock...
11
success

 

OrderCreate 的 getAmt 方法和 OrderHelper 的 resolve 方法被成功 mock 掉。

说明一下:@InjectMocks 会给 OrderCreate 装配 orderHelper 属性,其实就是根据 @Mock 来着啊。在下面这句代码执行完后

        MockitoAnnotations.initMocks(this);

把被 mock 掉的 OrderHelper 给了 OrderCreate 的私有属性 orderHelper。这里 OrderCreate 本身也是被 mock 掉了。

 

好,稍微觉得 Mockito 有点意思了吧,但这还没解决我的需求,在我开始 mock 处理时我前面还有一长串的处理。

 

那我再加几个有趣的类吧:OrderBefore.java,OrderStart.java。

package com.practice.mock;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * mock 测试准备类
 *
 * @author tiger
 * @version 1.0.0 createTime: 15-1-8 下午7:51
 * @since 1.6
 */
@Component
public class OrderBefore {

    @Autowired
    private OrderStart orderStart;

    public void before(){
        System.out.println("before...");
        orderStart.start();
    }
}

 

package com.practice.mock;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * mock 测试准备类
 *
 * @author tiger
 * @version 1.0.0 createTime: 15-1-8 下午7:51
 * @since 1.6
 */
@Component
public class OrderStart {

    @Autowired
    private OrderCreate orderCreate;

    public void start(){
        System.out.println("start...");
        orderCreate.create();
    }
}

 

单元测试类 MockSpringTest 的代码变成了这样:

 

public class MockSpringTest extends BaseSpringTest {

    @Autowired
    private OrderBefore orderBefore;

    @InjectMocks
    private OrderCreate orderCreate = mock(OrderCreate.class);

    @Mock
    private OrderHelper orderHelper;

    @Before
    public void initMocks() throws Exception {
        MockitoAnnotations.initMocks(this);
        doReturn(11).when(orderCreate).getAmt();
        doReturn("success").when(orderHelper).resolve();
        doCallRealMethod().when(orderCreate).create();
    }

    @Test
    public void create() {
        System.out.println("start mock...");
        orderBefore.before();
    }
}
 

 

 猜一下会输出什么。

 

输出结果:

 

start mock...
before...
start...
10
resolve order
 
很遗憾,没有达到预期,分析一下。
从 OrderBefore 的 before() 方法开始,调用了 @Autowired 注入的 orderStart.start(),然后又调了 @Autowired 注入的 orderCreate.create(),再调用了 @Autowired 注入的 orderHelper.resolve() 结束。没错整个流程没有和 mock 扯上关系,似乎唯一的解决办法就是从一开始就 mock,一直 mock 到整个流程结束。但是我前面说了我的流程很长,中间使用 spring @Autowired 注入的类不知道有多少,我就后面几个地方需要 mock,从头 mock 到尾我想都不敢想,那写出来足够吓人的。
幸好,我前面看到了这篇帖子:http://www.cnblogs.com/syxchina/p/4150879.html,标题和我差不多,不过不影响。
我引进了帖子中的 AopTargetUtils 工具类之后解决了我的问题,MockSpringTest 的代码变成了下面这样:
public class MockSpringTest extends BaseSpringTest {

    @Autowired
    private Order order;

    @Autowired
    private OrderBefore orderBefore;

    @Autowired
    private OrderStart orderStart;

    @InjectMocks
    private OrderCreate orderCreate = mock(OrderCreate.class);

    @Mock
    private OrderHelper orderHelper;

    @Before
    public void initMocks() throws Exception {
        MockitoAnnotations.initMocks(this);
        ReflectionTestUtils.setField(AopTargetUtils.getTarget(orderStart), "orderCreate", orderCreate);
        doReturn(11).when(orderCreate).getAmt();
        doReturn("success").when(orderHelper).resolve();
        doCallRealMethod().when(orderCreate).create();
    }

    @Test
    public void create() {
        System.out.println("start mock...");
        orderBefore.before();
    }
}
 
成功输出:
start mock...
before...
start...
11
success
 
另外,BaseSpringTest 是用来加载 Spring 配置,Mock 的常用注解 @Mock,@InjectMocks,@Spy,@Captor 有这些,不了解的话 google 一下吧。
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
分享到:
评论

相关推荐

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

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

    基于Springboot+Junit+Mockito做单元测试的示例

    单元测试可以帮助我们早期发现问题,避免在集成测试中发现问题,从而减少修复成本。 二、Springboot单元测试 Springboot框架提供了强大的单元测试支持,包括自动配置测试环境、MockMvc等。使用Springboot可以快速...

    Struts+Spring框架下的单元测试[总结].pdf

    总之,单元测试是保证代码质量的重要手段,在Struts+Spring的环境下,需要结合JUnit和Mockito等工具,对Action、Service和DAO进行有效的测试,确保每一层的功能都能够正确无误地工作。通过详尽的测试,可以提前发现...

    struts+hibernate+spring集成教程

    7. **测试与部署**:学习如何对集成后的系统进行单元测试和集成测试,使用JUnit、Mockito等工具,确保代码质量。最后,了解如何将应用打包成WAR文件,部署到Tomcat或Jetty等应用服务器上。 以上就是"Struts+...

    drools6.4+spring集成

    6. **测试与调试**:创建单元测试确保集成正确,可以使用Drools提供的TestScenario API进行规则测试,同时利用Spring的Mockito等工具进行业务逻辑验证。 在`spring-drools-demo`这个项目中,可能包含了一个简单的...

    最简单的含单元测试的spring boot+activiti集成demo

    【标题】"最简单的含单元测试的spring boot+activiti集成demo" 描述了一种将流行的Spring Boot框架与流程管理工具Activiti结合使用的实践案例。这个集成演示项目旨在帮助开发者快速理解和实现基于Spring Boot的...

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

    本篇文章将深入探讨如何在Spring项目中集成TestNG和Mockito进行单元测试。 TestNG是一个强大的测试框架,它扩展了JUnit的功能,提供了更灵活的测试配置,如并发测试、更丰富的注解、更详尽的测试报告等。首先,你...

    基于TestNG+Mockito及自动装配注解的Spring MVC集成测试

    本篇文章将深入探讨如何结合TestNG、Mockito以及Spring的自动装配注解进行有效的集成测试。以下是对这些技术的详细说明: TestNG是一个功能强大的测试框架,它是JUnit的替代品,提供了更丰富的功能,如并行测试执行...

    Spring3单元测试和集成测试

    在Spring框架中,单元测试和...通过上述内容,我们可以了解到Spring3中如何进行单元测试和集成测试,以及如何结合Mockito等工具来编写更高效的测试。理解并熟练运用这些测试技术,将有助于提高代码质量,降低维护成本。

    springboot +tkmybatis + generator+单元测试.zip

    在SpringBoot项目中,JUnit与Mockito等工具结合,可以有效地对服务层、DAO层进行单元测试。 6. **tk-demo-master**: 这个文件名可能是一个Git仓库的主分支名称,暗示这个压缩包包含了一个基于SpringBoot、TK...

    07. Spring Boot单元测试

    总结,Spring Boot的单元测试涵盖多个层次,从简单的类方法测试到复杂的集成测试,都有相应的工具和策略。理解和熟练运用这些知识点,能有效提升开发效率,保证代码质量。在实际项目中,应根据需求选择合适的测试...

    综合spring mvc + spring + hibernate + bootstrap开发图书管理系统

    5. **单元测试与集成测试**:利用JUnit和Mockito等工具进行测试,确保代码质量。 6. **缓存机制**:如使用Redis进行数据缓存,减少数据库压力。 7. **任务调度**:使用Quartz或Spring Task进行定时任务,如自动提醒...

    mybatis+spring+springtest

    "springtest" 是Spring框架的一部分,提供了测试支持,包括对Spring应用上下文的加载、模拟依赖注入、声明式事务管理等,使得对Spring应用进行单元测试和集成测试变得简单。 在集成MyBatis、Spring和Spring Test的...

    struts2+spring练习

    9. **单元测试**:使用JUnit和Mockito等工具,可以对Action、Service和DAO进行单元测试,确保代码的正确性。 10. **整合测试**:在项目中,可能还需要进行整合测试,例如使用Struts2的TestNG插件或Spring的MockMVC...

    单元测试案例junit +spring mvc +springboot

    JUnit作为Java领域最流行的单元测试框架,与Spring MVC和Spring Boot的集成使得开发者能够更高效地进行测试驱动开发(TDD)或行为驱动开发(BDD)。下面将详细介绍这个主题中的相关知识点。 1. JUnit JUnit是一个...

    测试+JUnit+单元测试+学习阶段

    分类则可以将测试分为不同的类型,如快速测试、集成测试等,便于按需执行。 在实际项目中,配合Mockito等模拟框架,我们可以对依赖对象进行隔离,专注于当前方法的测试,避免外部因素干扰。Mockito提供了丰富的mock...

    struts2+spring+hibernate网上书店系统

    测试方面,可能会使用JUnit进行单元测试,Mockito模拟对象进行隔离测试,Selenium进行UI自动化测试,保证系统的稳定性和可用性。 在部署时,该系统通常会运行在Tomcat、Jetty等Java应用服务器上,配合MySQL、Oracle...

    spring+jpa+全局异常+单元测试

    综上所述,"spring+jpa+全局异常+单元测试"这个主题涵盖了Java后端开发中的核心技术和最佳实践。通过有效地整合这些技术,我们可以构建出健壮、易于维护的业务系统,并通过严格的测试确保其质量。

    Struts2+Hibernate+Spring整合开发深入剖析与范例应用06

    可能会介绍如何使用JUnit、Mockito等工具进行单元测试和集成测试,确保每个组件都能正常工作。 9. **持续集成与部署**:项目可能还会涉及持续集成工具如Jenkins,以及应用服务器如Tomcat的配置和部署,这些都是将...

    spring整合单元测试Junit开发包

    6. **Integration测试**: `@WebAppConfiguration`和`@SpringBootTest`注解可用于集成测试,它们会启动一个完整的Spring Web应用上下文,让你可以测试服务、控制器以及它们之间的交互。 7. **Transactional测试**: `...

Global site tag (gtag.js) - Google Analytics