mockito 使用Mockito批注

示例

我们要测试的类是:

public class Service{

    private Collaborator collaborator;

    public Service(Collaborator collaborator){
       this.collaborator= collaborator;
    }
    
    
    public String performService(String input){
        return collaborator.transformString(input);
    }
}

它的合作者是:

public class Collaborator {

    public String transformString(String input){
        return doStuff();
    }

    private String doStuff()
    {
        // 此方法可能充满了错误
        . . .
        return someString;
    }

}

在我们的测试中,我们想打破依赖关系Collaborator及其错误,因此我们将模拟Collaborator。使用@Mock注释是为每个测试创建不同的模拟实例的便捷方法:

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.InjectMocks;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class ServiceTest {

    @Mock
    private Collaborator collaboratorMock;

    @InjectMocks
    private Service service;
    
    @Test
    public void testPerformService() throws Exception {
        // 配置模拟
        doReturn("output").when(collaboratorMock).transformString("input");            

        // 执行测试
        String actual = service.performService("input");
        
        // 朱尼特断言
        String expected = "output";
        assertEquals(expected, actual);
    }
    
    
    @Test(expected=Exception.class)
    public void testPerformServiceShouldFail() throws Exception {
        // 配置模拟
        doThrow(new Exception()).when(collaboratorMock).transformString("input");

        // 执行测试
        service.performService("input");
    }
}

Mockito将尝试按以下顺序解决依赖项注入:

  1. 基于构造函数的注入-使用大多数参数将模拟注入到构造函数中(如果找不到某些参数,则传递null)。如果通过构造函数成功创建了对象,则不会应用其他策略。

  2. 基于Setter的注入-模拟是按类型注入的。如果有多个相同类型的属性,则属性名称和模拟名称将匹配。

  3. 直接场注入-与基于二传手的注入相同。

请注意,如果上述任何策略失败,则不会报告失败。

请@InjectMocks在最新版本的Mockito中查询最新的有关此机制的更多详细信息。