使用Spring+Junit+Mockito做代码自测

本文介绍如何使用Mockito框架进行单元测试,重点演示如何通过Mockito替换Dubbo接口,实现对远程服务调用的模拟。通过具体示例代码展示了如何设置Mock对象及其预期行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重构代码时一套完善的测试工作能给我们莫大的帮助,下面时我使用Mockito做的Demo,目的是替换掉Dubbo 的相关接口。供不熟悉Mockito 的同学做参考。

junit:junit:4.11
org.springframework:spring-test:3.2.4.RELEASE
org.mockito:mockito-all:1.10.19
jdk1.8


  • BaseTest
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@ContextConfiguration(locations = {"classpath:spring/application.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class BaseTest {
    @Before
    public void setup() {
        /** 如果同时需要注入和mock注入,SpringJUnit4ClassRunner的前提下,注入mock */
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test() {
        Assert.assertEquals(1, 1);
    }
}

  • MockTestDemo
import cn.idongjia.makalu.biz.PostBO;
import cn.idongjia.makalu.domain.post.MakaluUser;
import cn.idongjia.makalu.manager.ClanManager;
import cn.idongjia.makalu.pojo.post.Post;
import cn.idongjia.makalu.repo.PostRepo;
import cn.idongjia.makalu.service.PostService;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.Spy;

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

/*
 * service 被标记了 @InjectMocks , 在 setup 方法中 执行 MockitoAnnotations.initMocks(this); 的时候,会将标记了
 * @Mock或 @Spy 的属性注入到 service 中。
 * 如果是 @Mock, 那就是通常的方式,service里面的provider完全被Mock实例替换,所有的调用都是针对Mock生成类的。
 * 如果是 @Autowired 加 @Spy , 那么对于定制了返回值的会调用 Mock实例,否则会调用真实注入的属性。
 */
public class MockTestDemo extends BaseTest{

    @InjectMocks
    @Resource
    PostService postService;

    @InjectMocks
    @Spy
    @Resource
    private PostBO postBO;//注入到postService 中

    @InjectMocks
    @Spy
    @Resource
    private PostRepo postRepo;//注入到postRepo 中

    //Dubbo接口
    @Mock
    private ClanManager clanManager;//注入到postRepo 中

    @Test
    public void test() {
        System.out.println("======***************");
        /**
         * 构造一个自己的对象。
         */
        User mu = new User();
        mu.setUsername("zzz");

        Optional<User> user = Optional.of(mu);

        // 设置模拟对象的返回预期值
        Mockito.when(clanManager.takeUser(21L)).thenReturn(user);

        Post post = this.postService.get(5L);
        System.out.println(String.format("使用mock后的结果:%s", post.getUsername()));//修改后的结果值
        System.out.println("======***************");
    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值