和Mockito一起,
模拟是包装类的实现。
模拟对象“包装”模拟对象的目标
(示例中的服务)
并允许您定义每个方法的功能。
Mockito有两个模拟功能选项;
调用包装方法,不要调用包装方法。
我不知道什么时候调用包装方法才有意义,
所以我总是使用不调用包装方法。
在你制作了模型之后,
使用mockito.doreturn(返回值).when(mockobject).method(方法参数)方法模拟功能。
编辑:更多信息。
我假设您使用的是JUnit v4。
根据JUnit的主要版本号,这方面的细节会有所不同,
但实际工作是一样的。
-
使用注释定义模拟对象(
@Mock
),请
除了一些特殊情况。
这将创建非最终类的模拟,
抽象类,
和接口。
-
使用创建“测试前”方法
@Before
注释;
我传统上叫这个方法
preTestSetup
,
但真正的名字并不重要。
-
呼叫
MockitoAnnotations.initMocks(this)
作为第一行代码
在“试验前”方法中。
这将找到
嘲讽
注释并为每个实例实例化一个模拟。
-
使用
ReflectionTestUtils.setField
方法将模拟注入到对象中(假设您没有setter方法,
传统上我不喜欢)。
-
使用定义每个方法的模拟功能
Mockito.doReturn(returnvalue).when(mockObject).method(method parameters)
技术。
下面是一些示例代码
(警告:
这应该是完全正常的,
但我没有编译它):
public interface MyService
{
String blammy(SomeParameter parameter);
}
public class UsesMyService
{
@Autowired
private MyService myService;
public String kapow(final SomeParameter parameter)
{
return myService.blammy(parameter);
}
}
public class UnitTestUsesMyService
{
private UsesMyService classToTest;
@Mock
private MyService mockMyService;
@Mock
private SomeParameter mockSomeParameter;
@Before
public void preTestSetup()
{
MockitoAnnotations.initMocks(this);
classToTest = new UsesMyService();
doReturn("Blam").when(mockMyService).blammy(mockSomeParameter);
ReflectionTestUtils.setField(
classToTest,
"myService",
mockMyService);
}
@Test
public void kapow_allGood_success()
{
final String actualResult;
actualResult = classToTest.kapow(mockSomeParameter);
assertNotNull(actualResult); // Not strictly necessary.
assertEquals(
"Blam",
actualResult);
}
}