我正在學習模擬,我想知道是否可以使用類似這樣的代碼:
Mockito.when(service.authenticateUser(test)).thenReturn(any());
驗證身份驗證是否成功。
service.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方法回傳 a Player,但是有沒有可能的方法告訴 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():使用身份驗證的主要部分)
while(true) {
try {
dsbs.authenticateUser(view.readCredentials());
if(dsbs.getLoggedPlayer() != null){
break;
}
} catch (AuthenticationException ae) {
ae.printStackTrace();
}
}
uj5u.com熱心網友回復:
您不能any(...)在 thenReturn 陳述句中使用,這就是錯誤的來源。
此代碼應該可以作業:
Mockito.when(service.authenticateUser(test)).thenReturn(new Player(...));
assertNotNull(service.authenticateUser(test));
現在,如果您想根據登錄的值存根不同的結果,您可以在 when() 部分使用 argumentMatchers:
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 將嘗試以與存根相反的順序匹配您的引數,因此在這里它將首先檢查登錄名是否在給定串列中,如果該存根失敗,它將回退到第一個存根,即將為其他任何事情拋出 AuthenticationException。
如果您希望回傳的 Player 依賴于登錄用戶,您可以使用.thenAnswer()代替.thenReturn(). 請參閱Mockito :doAnswer Vs thenReturn
uj5u.com熱心網友回復:
Mockito.when(service.authenticateUser(test)).thenReturn(any(Player.class));
assertNotNull(service.authenticateUser(test));
通過模擬 的回傳值service.authenticateUser(test),您正在測驗 Mockito,而不是您自己的代碼。
有沒有辦法告訴 Mockito 我只想拿回一些東西,如果它有效的話?所以我將能夠測驗身份驗證是否成功
不要為此使用 Mockito。相反,您需要創建一個串列initializedPlayers并使其可用于該authenticateUser()函式。理想情況下,您可以在測驗中創建物件時將此串列傳遞給service物件的建構式。service如果沒有,那么您必須以一種可以在需要時獲得他們的方式來創建玩家。
同樣,您可以創建一個測驗來驗證當給定用戶不在玩家串列中時是否會authenticateUser ()拋出。AuthenticationException
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/477574.html
