`
baowp
  • 浏览: 98780 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

junit单元测试3:springockito

    博客分类:
  • java
阅读更多

       接http://baowp.iteye.com/blog/1988249,前文举例了一个使用mockito在spring管理的实例中注入一个mock对象的情况,但是仅限于直接引用的对象且要写MockitoAnnotations.initMocks(this)使其生效。

       如何能够与spring结合得更深,就像是注入spring bean一样地注入mock对象,这样对于写包含外部依赖的单元测试会完美些。如下:

    

  单例类,测的是bookService.list()

package com.iteye.baowp.domain.service;

import com.iteye.baowp.domain.entity.BookEntity;
import com.iteye.baowp.domain.reference.RemoteService;
import com.iteye.baowp.domain.repository.BookRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kubek2k.springockito.annotations.ReplaceWithMock;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

/**
 * Created with IntelliJ IDEA.
 * User: baowp
 * Date: 12/7/13
 * Time: 10:26 AM
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"BookServiceTest-context.xml", "spring-mockito.xml"})
public class SpringockitoXmlMockTest {

    @Resource
    private BookService bookService;

    @ReplaceWithMock
    @Resource
    private RemoteService remoteService;

    @ReplaceWithMock
    @Resource
    private BookRepository bookRepository;

    @Test
    public void testList() {
        //构造一个结果集
        BookEntity book = new BookEntity();
        book.setTitle("title");
        book.setPrice(1.1f);
        List<BookEntity> books = new ArrayList<BookEntity>();
        books.add(book);

        {//设置方法返回的期望结果
            when(bookRepository.list()).thenReturn(Collections.<BookEntity>emptyList());
            when(remoteService.remoteBooks()).thenReturn(books);
        }

        List<BookEntity> list = bookService.list();
        assertEquals(1, list.size());
        assertSame(book, list.get(0));

        verify(bookRepository).list();//断言bookRespotitory.list()被调用一次
        verify(remoteService).remoteBooks();//断言remoteService.remoteBooks()被调用一次
    }
}

 功能实现类,里面注入的两个bean在上文中调用时已经被mock,将返回期望的结果:

package com.iteye.baowp.domain.service.impl;

import com.iteye.baowp.domain.entity.BookEntity;
import com.iteye.baowp.domain.reference.RemoteService;
import com.iteye.baowp.domain.repository.BookRepository;
import com.iteye.baowp.domain.service.BookService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * User: baowp
 * Date: 11/27/13
 * Time: 3:04 PM
 */
@Service("bookService")
public class BookServiceImpl implements BookService {

    @Resource
    private BookRepository bookRepository;
    @Resource
    private RemoteService remoteService;

    public List<BookEntity> list() {
        List<BookEntity> list = bookRepository.list();
        if (list.isEmpty()) {
            list = remoteService.remoteBooks();
        }
        return list;
    }

}

 

        springockito圆满地解决了上篇中提到的缺陷,该maven依赖会自动引入mockito。@ReplaceWithMock @Resource联合标注的为mock对象,并注入为spring bean,无论它被哪个spring bean引用(包括间接引用),都能够正确注入。

 

        BookServiceTest-context.xml是一个正常的spring配置文件,spring-mockito.xml是mock bean的配置文件,加载这两个配置文件的时候,如果有同名beanId将以mock bean为准。

 

   spring-mockito.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mockito="http://www.mockito.org/spring/mockito"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.mockito.org/spring/mockito https://bitbucket.org/kubek2k/springockito/raw/tip/springockito/src/main/resources/spring/mockito.xsd">

    <mockito:mock id="remoteService" class="com.iteye.baowp.domain.reference.RemoteService" />
    <mockito:mock id="bookRepository" class="com.iteye.baowp.domain.repository.BookRepository" />
</beans>

 

  maven usage:    

        <dependency>
            <groupId>org.kubek2k</groupId>
            <artifactId>springockito</artifactId>
            <version>1.0.9</version>
            <scope>test</scope>
        </dependency>

 

          单元测试预期已经达到,但是每次写单测多出来一个spring-mockito.xml的配置文件,有一个小冗余。

分享到:
评论
1 楼 GlacialDrift 2017-04-28  
spring-mockito.xml 配置文件可以不用写的。
在 测试类里面使用
@WrapWithSpy 和 @ReplaceWithMock 就可以替代配置了

相关推荐

    Junit 单元测试完整案例

    【Junit单元测试完整案例】深入解析 在软件开发中,单元测试是验证代码功能是否正确、独立单元是否按预期工作的关键步骤。Junit作为Java领域最常用的单元测试框架,为开发者提供了简单易用的API来进行测试。本案例...

    Junit单元测试的实验报告.docx

    简单介绍了Junit的安装过程与实例应用。应用的问题是软件测试中的佣兵问题,整个文档中有代码及测试结果,可以更好地帮助学生了解Junit单元测试中的作用。

    Junit单元测试文档

    junit3 junit4 api,单元测试的利器

    junit单元测试jar包集

    这里提到的四个文件是Java开发中常用的单元测试框架和库,分别是JUnit、DBUnit、Unitils和Mockito。让我们逐一深入探讨它们的功能和使用方法。 **JUnit** 是Java领域中最广泛使用的单元测试框架,这里的`junit-4.11...

    在java中使用 junit单元测试

    "JUnit单元测试在Java中的应用" 在Java中使用JUnit单元测试是软件开发过程中不可或缺的一部分。单元测试是指在开发过程中,对代码的一部分进行测试,以确保代码的正确性和可靠性。在Java中,JUnit是最流行的单元...

    Junit单元测试所需要的两个jar包

    3 Junit单元测试框架的作用以及好处. 用来对类中的方法功能进行有目的的测试,以保证程序的正确性和稳定性。 能够让方法独立运行起来。 好处: 可以书写一系列的测试方法,对项目所有的接口或者方法进行单元测试。 ...

    java单元测试篇:使用clover为java代码的junit测试做覆盖率分析.pdf

    Java 单元测试篇:使用 Clover 为 Java 代码的 JUnit 测试做覆盖率分析 Java 单元测试是软件测试的重要组成部分,对于 Java 开发者来说,单元测试是必不可少的。今天,我们将学习使用 Clover 框架来分析 Java 代码...

    软件测试中Junit单元测试实例

    上下文时间软件测试中Junit单元测试实例在一种传统的结构化编程语言中,比如C,要进行测试的单元一般是函数或子过程。在象C++这样的面向对象的语言中,要进行测试的基本单元是类。对Ada语言来说,开发人员可以选择是...

    Junit单元测试Junit单元测试Junit单元测试Junit单元测试

    Junit单元测试框架 Junit是Java语言中最流行的单元测试框架,可以帮助开发者编写和运行单元测试,以确保软件的正确性和可靠性。Junit提供了一个统一的测试框架,允许开发者使用Annotations来定义测试用例,实现自动...

    Junit单元测试内部机制解析

    ### Junit单元测试内部机制深度解析 #### 一、自动化软件测试的重要性 随着软件工程的不断发展,软件的规模和复杂性急剧增加,软件测试成为确保软件质量和可靠性的关键环节。自动化测试,尤其是单元测试,因其高效...

    spring MVC junit 单元测试(controller)

    这篇博客主要探讨了如何使用JUnit进行Spring MVC Controller的单元测试。在实际开发中,单元测试可以帮助我们尽早发现潜在的问题,提高软件的可靠性和可维护性。 首先,让我们了解Spring MVC的基本概念。Spring MVC...

    JUnit单元测试原则 单元测试工具

    ### JUnit单元测试原则与工具详解 #### 一、单元测试概述 单元测试(Unit Testing)是一种软件测试方法,主要用于验证程序中的最小可测试单元(通常是单个函数或方法)是否按预期工作。对于Java这样的面向对象语言来...

    junit单元测试使用方法(实例)

    ### JUnit单元测试使用方法详解 #### 一、JUnit简介及意义 JUnit 是一个流行的 Java 编程语言的单元测试框架。它最初由 Erich Gamma 和 Kent Beck 创建,旨在简化软件开发过程中的测试工作。单元测试是软件开发...

    在Eclipse中使用JUnit4进行单元测试

    在Eclipse中使用JUnit4进行单元测试是一种常见的Java开发实践,它可以帮助开发者确保代码的正确性和稳定性。单元测试是软件开发中的重要环节,通过编写针对代码各个独立模块的测试用例,可以验证代码功能是否按预期...

    junit4单元测试报错:method initializationerror not found

    junit4单元测试报错:method initializationerror not found 缺少jar包导致,总共需要三个jar包:junit-4.11.jar,hamcrest-core-1.3.rc2.jar,hamcrest-library-1.3.rc2.jar,都在压缩包里了。

    junit单元测试实验

    知识点3:如何编写单元测试用例 编写单元测试用例需要遵循一定的格式和规则。通常情况下,单元测试用例的名称以"test"开头,紧跟着要测试的方法名。例如,要测试add方法,可以编写一个名为testAdd的单元测试用例。...

    单元测试之道(Java):使用JUnit进行单元测试

    单元测试之道(Java):使用JUnit进行单元测试。单元测试是提高代码质量的有效手段,但大部分开发人员由于种种原因都不乐意进行单元测试。

Global site tag (gtag.js) - Google Analytics