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

【java|使用Spring+Junit+Mockito做代码自测】重构代码时一套完善的测试工作能给我们莫大的帮助,下面时我使用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 = 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("======***************"); }

    推荐阅读