[英]Using same ArgumentMatchers in Mockito.when multiple times
我最近一直在學習測試,但這是我必須在要模擬的函數中傳遞變量的第一個測試。 我編寫了一個類似的測試,唯一的區別是我在此測試中使用了ArgumentMatcher,因為testInput.validate()需要3個字符串來傳遞。 我對這些東西不太了解,所以對不起該術語。
這是我要測試的代碼:
@Component
public class RequestHandler {
private static Gson gson = new Gson();
private final UserRepository userRepository;
private final TestInput testInput;
@Autowired
public RequestHandler(UserRepository userRepository, TestInput testInput) {
this.userRepository = UserRepository;
this.testInput = testInput;
}
public String addUser(String username, String email, String password) {
if (testInput.validate(username, email, password) && !(userRepository.findById(email).isPresent())) {
User user = new User(username, email, password);
userRepository.save(user);
return gson.toJson(user);
} else {
return gson.toJson("error");
}
}
}
這是我的測試:
public class RequestHandlerTest {
UserRepository userRepository = Mockito.mock(UserRepository.class);
TestInput testInput = Mockito.mock(TestInput.class);
RequestHandler requestHandler = new RequestHandler(userRepository, testInput);
String test = ArgumentMatchers.anyString();
@Test
public void addUserTest() {
Mockito.when(testInput.validate(test, test, test)).thenReturn(true, false);
Mockito.when(userRepository.findById(test).isPresent()).thenReturn(false, true);
String jsonUser = new Gson().toJson(new User("username123","example@mail.com","12344321"));
String jsonError = new Gson().toJson("error");
System.out.println("addUser Test1");
assertEquals(jsonUser, requestHandler.addUser("username123","example@mail.com","12344321"));
System.out.println("addUser Test2");
assertEquals(jsonError, requestHandler.addUser("username123","example@mail.com","12344321"));
}
}
我的這段代碼有很多錯誤,當我將ArgumentMatchers.anyString()更改為ArgumentMatchers.any()時,出現了1個錯誤,而不是5個錯誤。
您的測試中有很多問題。
你不能這樣使用
String test = ArgumentMatchers.anyString(); Mockito.when(testInput.validate(test, test, test)).thenReturn(true, false);
您可以從錯誤消息中清楚地看到執行此操作時Mockito在說什么
org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 3 matchers expected, 1 recorded:
這意味着您需要傳遞三個不同的實例。
這條線也不正確
Mockito.when(userRepository.findById(test).isPresent()).thenReturn(false, true);
findById
應該返回Optional,但是您返回的是布爾值。 使用Mockito時,應該模擬各個步驟。 我的意思是在您的示例中,您需要模擬userRepository.findById(test)
,然后在返回的模擬上進行isPresent
。 您不能跳過一個步驟而轉到下一個步驟。
這是一個工作代碼
public class RequestHandlerTest {
UserRepository userRepository = Mockito.mock(UserRepository.class);
TestInput testInput = Mockito.mock(TestInput.class);
RequestHandler requestHandler = new RequestHandler(userRepository, testInput);
@Test
public void addUserTest() {
when(testInput.validate(anyString(), anyString(), anyString())).thenReturn(true, false);
User username123 = new User("username123", "example@mail.com", "12344321");
String jsonUser = new Gson().toJson(username123);
String jsonError = new Gson().toJson("error");
when(userRepository.findById(anyString())).thenReturn(Optional.empty(),Optional.of(username123));
System.out.println("addUser Test1");
assertEquals(jsonUser, requestHandler.addUser("username123","example@mail.com","12344321"));
System.out.println("addUser Test2");
assertEquals(jsonError, requestHandler.addUser("username123","example@mail.com","12344321"));
}
}
我調查了此問題的源代碼,並向其他讀者提供了信息,潛在的問題是該模擬函數被聲明為“靜態”。 從發布的問題中看不出來。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.