引入Mockito让你的测试用例更优美一些 - Java代码测试

引入Mockito让你的测试用例更优美一些 - Java代码测试_第1张图片

Mockito简介
什么是mock? 在软件开发的世界之外, “mock”一词是指模仿或者效仿。
因此可以将“mock”理解为一个替身,替代者. 在软件开发中提及”mock”,通常理解为模拟对象或者Fake。

为什么需要Mock?
Mock是为了解决units之间由于耦合而难于被测试的问题。所以mock object是unit test的一部分。

使用场景:
你和朋友联合开发,你已经开发好了,朋友已经给了开发文档,但是没有开发好。
此时你已经等不及要开始联调测试自己的代码逻辑了。

遇到这种场景:
最开始,我们会在业务逻辑中把调用的代码给注释掉(因为调不通,朋友还没有开发好),然后把预期的结果直接返回。
就像下面这样。

//朋友未写好的方法(可以是Spring中Bean也可以是Dubbo调用)
@Service
class UserService{

    public String getUserName(String uid){
        ....
        return null;
    }
}
//我们需要测试的代码(注意我们引入了朋友为写好的方法,如果此时测试直接调用肯定会出错)
@Service
class Me{

    @Resource
    UserService userService;

    public void getUserName(){
    String userName = userService.getUserName();
    sout("Nihao"+userName)
    }

}

我们要测试Me.class,一般在不使用Mockito之前我们可能就是直接改代码,去测试.像下面这样

@Service
class Me{

    @Resource
    UserService userService;

    public void getUserName(){
    //String userName = userService.getUserName();
    String userName = "测试";
    sout("Nihao"+userName);
    }

}

如果我们使用了Mockito是什么样呢?

@RunWith(MockitoJUnitRunner.class)
class Test(){
    //会自动将Mock的实例,注入到被标记的依赖的类中
    @InjectMock
    @Resource
    Me me;

    //我们引入未写好的方法
    @Spy
    @Resource
    UserService userService;

    //在不修改我们代码me的情况下,完成测试。
    @Test
    public void test(){
          Mockito.doReturn("测试").when(userService).getUserName(
            Mockito.anyString());
    }


}

注意在使用Mockito之前要先引用MockitoJUnitRunner.class。或者下面这种,通过@Before通过方法的形式引入Mockito

class Test{
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }
    @Test
    public void test(){
          Mockito.doReturn("测试").when(userService).getUserName(
            Mockito.anyString());
    }
}

MockAPI

api是非常简单的

//创建Mock对象
Mockito.mock(List.class);
Mockito.spy(list);
//默克需要测试的方法
Mockito.when(spy.get(0)).thenReturn(1);
Mockito.doReturn(3).when(mock).get(3);
//mock任意的参数及类型
Mockito.anyString()
Mockito.anyInt()
...

POM依赖

   
            <dependency>
                <groupId>org.mockitogroupId>
                <artifactId>mockito-allartifactId>
                <version>1.8.5version>
                <scope>testscope>
            dependency>

总结Mock测试的优点:

  1. 团队可以并行工作
  2. 可以创建一个验证或者演示程序。
  3. 为无法访问的资源编写测试

你可能感兴趣的:(测试Mockito)