我正在学习mock,我想知道我是否可以使用类似的代码:
Mockito.when(service.authenticateUser(test)).thenReturn(any());
验证身份验证是否成功。
服务。AuthenticateUser(用户用户):
@Override
public Player authenticateUser(User login) throws AuthenticationException {
Player find = new Player();
for (Player player : initializedPlayers) {
if (login.getEmail().equals(player.getEmail()) && login.getPassword().equals(player.getPassword())) {
loggedPlayer = player;
return player;
}
}
throw new AuthenticationException("Incorrect email and/or password");
}
如您所见,login方法返回一个播放器,但是有没有可能告诉Mockito我只想拿回有效的东西?因此,我可以测试身份验证是否成功,例如:
Mockito.when(service.authenticateUser(test)).thenReturn(any(Player.class));
assertNotNull(service.authenticateUser(test));
^这种方法目前不起作用,它在存根上进行了失败的测试。
编辑:我尝试了两种不同的方法:
@Test
public void testFailAuthWithMockedService(){
DefaultSportsBettingService service = mock(DefaultSportsBettingService.class);
User test = new User("test","test");
Mockito.when(service.authenticateUser(test)).thenReturn(any(Player.class));
assertNotNull(service.authenticateUser(test));
}
@Test
public void testSuccessfulAuthWithMockedService(){
DefaultSportsBettingService service = mock(DefaultSportsBettingService.class);
User test = new User("validName","validPassword");
Mockito.when(service.authenticateUser(test)).thenReturn(any());
assertNotNull(service.authenticateUser(test));
}
这些规范符合要求,但我不确定它们是否真的很好。
附加信息:我在main中一开始就调用了此方法:
@Override
public Player authenticateUser(User login) throws AuthenticationException {
Player find = new Player();
for (Player player : initializedPlayers) {
if (login.getEmail().equals(player.getEmail()) && login.getPassword().equals(player.getPassword())) {
loggedPlayer = player;
return player;
}
}
throw new AuthenticationException("Incorrect email and/or password");
}
main():(main中使用身份验证的部分)
while(true) {
try {
dsbs.authenticateUser(view.readCredentials());
if(dsbs.getLoggedPlayer() != null){
break;
}
} catch (AuthenticationException ae) {
ae.printStackTrace();
}
}
Mockito.when(service.authenticateUser(test)).thenReturn(any(Player.class));
assertNotNull(service.authenticateUser(test));
通过模拟服务的返回值。authenticateUser(test),您正在测试Mockito,而不是您自己的代码。
有没有可能的方法告诉莫基托,我只想拿回一些东西,如果它有效的话?所以我可以测试身份验证是否成功
不要为此使用Mockito。相反,您需要创建一个初始化玩家
列表,并使其可用于AuthateUser()
函数。理想情况下,您可以在测试中创建此列表时将其传递给service
对象的构造函数。如果没有,那么您必须以service
将在需要时获取它们的方式创建玩家。
类似地,您可以创建一个测试来验证当给定用户不在玩家列表中时身份验证用户()
是否会抛出身份验证异常
。
您不能在thenBack语句中使用any(...)
,这就是错误的来源。
该代码应适用于:
Mockito.when(service.authenticateUser(test)).thenReturn(new Player(...));
assertNotNull(service.authenticateUser(test));
现在,如果您想根据登录名的值存根不同的结果,您可以在time()部分使用argumentMatcher:
Mockito.when(service.authenticateUser(any(User.class))
.thenThrow(AuthenticationException.class);
Mockito.when(service.authenticateUser(argThat(login -> list.contains(login))
.thenReturn(new Player(...));
assertNotNull(service.authenticateUser(test));
这里的顺序很重要:Mockito将尝试以存根的相反顺序匹配您的参数,因此在这里它将首先检查登录是否在给定的列表中,如果该存根失败,它将回退到第一个存根,这将为其他任何内容抛出身份验证异常。
如果希望返回的播放器依赖于登录用户,可以使用。然后用Answer()
代替。然后返回()。参见Mockito:doAnswer Vs thenReturn
问题内容: 我有一些需要经常打印的结构。现在,我正在围绕该结构使用经典的打印包装器: 此功能很方便,但实际上也很有限。如果不进行新包装,则无法添加或添加一些文本。我知道我可以使用 va_arg 系列添加或添加一些文本,但是我觉得我会重新实现。 我想知道是否有可能向printf编写自定义函数。我希望能够写这样的东西: 这可能吗 ?我怎样才能做到这一点 ? 注意:我在Ubuntu Linux 10.0
我不明白为什么不能将模拟的预定义行为移到and:块中。
这里,在引擎盖下调用。因此,我需要我的模拟实例返回(指示失败的auth),或者在发生意外情况时抛出。 你知道我该怎么做吗?
问题内容: 假设我有一个数组数组 我想将其解析为对象。当我用 它似乎不起作用,我通过使用进行了工作 有一个更好的方法吗? 问题答案: 是的,请使用。 将允许你指定你真正想要的泛型类型,这有助于GSON找到类型来使用反序列化过程。 它使用这种宝石:。它是匿名类的事实使它成为的子类。相当于一个类 该方法的规范指出 如果超类是参数化类型,则返回的对象必须准确反映源代码中使用的实际类型参数。 如果指定 返
问题内容: 我有以下测试方法,该方法使用从包中导入的函数。 可以在golang中进行模拟吗? 问题答案: 是的,只需进行简单的重构即可。创建一个函数类型的变量,用初始化,并让您的包调用而不是: 在测试中,您可以为分配另一个功能,该功能是在测试中定义的,并且可以执行测试所需的功能。 例如:
问题内容: 在JavaScript中使用构造函数创建类时,以后是否可以重新定义类的方法? 例: 现在,我想像这样重新定义: 因此,当我创建另一个时,新方法将被称为: 编辑: 我意识到我可以输入“ Hello”或“Hola”之类的参数来完成不同的输出。我还意识到我可以像这样简单地为p2分配一个新函数: 我只是想知道是否可以重新定义类的方法,以便的新实例将使用新方法。 问题答案: 以后可以重新定义类的