我最近一直在学习测试,但这是我必须在要模拟的函数中传递变量的第一个测试。我编写了一个类似的测试,唯一的区别是我在此测试中使用了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个错误。
答案 0 :(得分:1)
您的测试中有很多问题。
您不能这样使用
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"));
}
}
答案 1 :(得分:1)
我研究了此问题的源代码,并且对于其他读者来说,潜在的问题是该模拟函数被声明为“静态”。从发布的问题中看不出来。