2

我对 Mockito 有疑问。我想测试这个简单的类:

public class MyClass{
    private UserService userService;
    public void deleteUser(){
       userService.getAdminUser(1);
       userService.deleteUser(0);
    }
}

我写了这个简单的测试:

@RunWith(MockitoJUnitRunner.class)
    public class MyClassTest {
       @MockitoAnnotations.Mock
       private UserService userService;

        @Test
        public void test(){
           MyClass  myClass=new MyClass();
           myClass.userService=userService;
           myClass.deleteUser();
        }
    }

此测试运行没有错误。我等待它没有编译,因为没有对 userService 方法的任何调用..

4

3 回答 3

3

Mockito 创建的 Mocks 是“智能的”。当调用 void 方法时,它们不做任何事情。当调用返回对象的方法时,它们返回 null。当调用返回集合的方法时,它们会返回一个空集合。

如果您想验证getAdminUser()deleteUser()已被调用,请使用Mockito.verify().

这两件事在Mockito 文档的第1 点和第 2 点中进行了解释。特别是:

默认情况下,对于所有返回值的方法,mock 返回 null、空集合或适当的原始/原始包装器值(例如:0、false、...对于 int/Integer、boolean/Boolean、...)。

于 2013-06-01T13:57:18.603 回答
0

这是您如何使用一组不调用注释的不同方法对其进行测试的方法。请注意,这是 TestNG,但将其适应 JUnit 4+ 很容易:

import static org.mockito.Mockito.*;

public final class Test
{
    private UserService userService;

    @BeforeMethod
    public void init()
    {
        userService = mock(UserService.class);
    }

    @Test
    {
         final MyClass  myClass = new MyClass();
         myClass.userService = userService;
         myClass.deleteUser();
         verify(userService, times(1)).getAdminUser(1);
         verify(userService, times(1)).deleteUser(0);
    }
}

请注意,有一个只有一个参数的verify()变体,它与第二个参数完全相同times(1)。还有never().

例如,如果您想测试.deleteUser()没有使用任何参数调用该方法,您可以这样做:

verify(userService, never()).deleteUser(anyInt());
于 2013-06-01T14:05:42.980 回答
0

您没有添加任何检查以查看是否以任何方式使用了 userService。添加验证将为您做到这一点:何时使用 Mockito.verify()?

我建议您阅读 Mockito 在测试中的工作原理,我认为在学习设计以及如何处理对 mock 的方法调用时,您已经跳过了一些基础知识。

于 2013-06-01T13:55:50.693 回答