我是Mockito的新手,正在制作一个基本的例子。如果我注释掉测试下面的短线仍然通过,我做错了什么?
如果我删除存根行,我本来期望测试失败,因为'serviceUnderTest'不会从模拟依赖项中对'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();
}
}
}
答案 0 :(得分:1)
当你进行存根时,someObject
为空。因此,您要设置模拟以从该方法返回null
。
但是null
是模拟将从返回对象的方法返回的默认值。你的存根实际上没有任何区别。请注意,此规则有一些例外情况。
toString
方法返回模拟的名称。答案 1 :(得分:0)
原来这是我自己对Mockito的误解!
测试总是通过,因为在这种情况下,存根方法无关紧要。 stubbed方法用于为被测服务中的方法调用提供响应,但这并不意味着我没有调用我在测试结束时验证的实际方法。
我正在验证的方法在被测服务中被调用,而存根对此没有任何影响,因此它通过了。
答案 2 :(得分:-1)
首先,如果是纯单元测试,您可以使用@Before
和@RunWith
注释删除@InjectMocks
部分。他们将处理初始化阶段。
其次,你不需要放置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
的所需行为。