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将尝试按以下顺序解决依赖项注入:
基于构造函数的注入-使用大多数参数将模拟注入到构造函数中(如果找不到某些参数,则传递null)。如果通过构造函数成功创建了对象,则不会应用其他策略。
基于Setter的注入-模拟是按类型注入的。如果有多个相同类型的属性,则属性名称和模拟名称将匹配。
直接场注入-与基于二传手的注入相同。
请注意,如果上述任何策略失败,则不会报告失败。
请@InjectMocks在最新版本的Mockito中查询最新的有关此机制的更多详细信息。