我是Mockito的新手,并在下面进行了一个基本示例。如果我要评论测试下方的固执线,我在做什么错?
,如果我删除了固执线,我本来希望测试失败,因为" ServiceUnder -Test"将不会从模拟依赖项中的" dosomething"方法中返回正确的结果?
public class MyTest {
private MyService serviceUnderTest;
@Mock
private MyHelper mockedDependency;
@Before
public void doBeforeEachTestCase()
{
MockitoAnnotations.initMocks(this);
serviceUnderTest = new MyServiceImpl();
serviceUnderTest.setMyHelper(mockedDependency);
}
@Test
public void test1()
{
try
{
SomeObject someObject = null;
// create my stub
stub(mockedDependency.doSomething("123", false, false)).thenReturn(someObject);
// run the implementation
ServiceResult serviceResult = serviceUnderTest.anotherMethod("123", false, false);
// check the state
assertNotNull(serviceResult);
// check the behaviour of the mock
verify(mockedDependency).doSomething("123", false, false);
}
catch(Exception e)
{
fail();
}
}
}
在您进行固执时, someObject
为null。因此,您正在设置模拟以从该方法返回null
。
,但是null
是一个模拟物将返回对象的方法的默认值。您的固执实际上没有区别。请注意,此规则有一些例外。
- 如果方法返回集合,则默认申报表将是一个空的集合。
- 如果方法返回包装器类型之一,则默认返回为零或false,而不是null。
-
toString
方法返回模拟的名称
事实证明,这是我自己对莫科托的误解!
在这种情况下,由于固执方法无关紧要,该测试总是通过。使用的方法用于在测试中的服务中提供对方法调用的响应,这并不意味着我在测试结束时要验证的实际方法未调用。
我要验证的方法在正在测试的服务中调用,并且该存根对此没有影响,因此它通过了。
首先,如果它是纯单元测试,则可以使用@RunWith
和@InjectMocks
注释摆脱@Before
部分。他们将处理初始化阶段。
第二,您不愿放置try-catch
块,您只需在testMethod中声明Exception
。
最好使用when()
代替stub()
,例如:
@RunWith(MockitoJUnitRunner.class) public class MyTest {
@Mock
private MyHelper mockedDependency;
@InjectMocks
private MyService serviceUnderTest;
@Test
public void test1() throws Exception {
SomeObject someObject = null;
// create my stub
when(mockedDependency.doSomething("123", false, false)).thenReturn(someObject);
// run the implementation
ServiceResult serviceResult = serviceUnderTest.anotherMethod("123", false, false);
// check the state
assertNotNull(serviceResult);
// check the behaviour of the mock
verify(mockedDependency).doSomething("123", false, false);
}}
在您的案例行中,when(mockedDependency.doSomething
并不重要 - 测试是检查MyServiceImpl
的所需行为。