Mockito Stub对测试结果没有区别



我是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的所需行为。

相关内容

  • 没有找到相关文章