Рассмотрите возможность извлечения логики генерации имени пользователя как зависимости от UserService.
interface UserNameGenerator {
Strign generate();
}
Провод UserNameGenerator
То же, что и UserDao
. И измените код на:
public class UserService {
@Autowired
private UserDao dao;
@Autowired
private UserNameGenerator nameGenerator;
public void addUser(String username, String password) {
if (username.length() < 8 ) {
username = nameGenerator.generate();
}
User user = new User(username, password);
dao.save(user);
}
}
Затем создайте реализацию по умолчанию UserNameGenerator
и переместите туда логику генерации имени.
Теперь вы можете легко проверить поведение, высмеивая UserNameGenerator
и UserDao
.
Для проверки варианта использования, когда длина имени пользователя меньше 8
String username = "123";
String password = "pass";
String generatedName = "random";
// stub generator
when(nameGenerator.generate()).thenReture(generatedName);
// call the method
userService.addUser(username, password);
// verify that generator was called
verify(nameGenerator).generate();
verify(userDao).save(new User(generatedName, password));
Для проверки варианта использования, когда имя пользователя имеет длину, превышающую 8
String username = "123456789";
String password = "pass";
String generatedName = "random";
// call the method
userService.addUser(username, password);
// verify that generator was never called
verify(nameGenerator, never()).generate();
verify(userDao).save(new User(username, password));