我对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方法的调用..
答案 0 :(得分:3)
Mockito创造的模拟是"聪明"。当调用void方法时,他们什么都不做。当调用返回对象的方法时,它们返回null。当调用返回集合的方法时,它们返回一个空集合。
如果您要验证是否已调用getAdminUser()
和deleteUser()
,请使用Mockito.verify()
。
Mockito documentation,第1点和第2点解释了这两件事。特别是:
默认情况下,对于返回值的所有方法,mock返回null,空集合或适当的原始/原始包装值(例如:0,false,...表示int / Integer,boolean / Boolean,...) 。
答案 1 :(得分:0)
您尚未添加任何检查以查看是否以任何方式使用userService。添加验证将为您完成此操作:When to use Mockito.verify()?
我建议你阅读Mockito如何在测试中工作,我认为你在学习设计以及如何处理模拟方法调用方面已经超越了一些基础知识。
答案 2 :(得分: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());