mockito stub对测试结果没有影响?

时间:2014-02-05 10:21:08

标签: java testing mocking mockito

我是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();
    }
}

}

3 个答案:

答案 0 :(得分:1)

当你进行存根时,someObject为空。因此,您要设置模拟以从该方法返回null

但是null是模拟将从返回对象的方法返回的默认值。你的存根实际上没有任何区别。请注意,此规则有一些例外情况。

  • 如果方法返回一个集合,则默认返回将是一个空集合。
  • 如果方法返回其中一个包装器类型,则默认返回值为零或false,而不是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的所需行为。