рд╕реИрд▓реНрдпреВрдЯ, рдЦрд╛рдмрд░реЛрд╡рд╕реНрдХред рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдЫрд╛рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдПрдХ рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХрд╛ рдЕрдиреБрд╡рд╛рдж "рдбреЗрд╡рд▓рдкрд░ рдСрди рдж рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ" рд╕рдордп рдкрд░ рдкрд╣реБрдВрдЪрд╛ред рдкрд╣рд▓рд╛ рднрд╛рдЧ рдпрд╣рд╛рдБ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред
рд╡рд╕рдВрдд рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЬрд╛рд╡рд╛ рд╡рд┐рдХрд╛рд╕ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдпрд╣ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА, рдмрд▓реНрдХрд┐ рдЙрдкрдХрд░рдг рд╕реАрдЦрдиреЗ рдореЗрдВ рдХрдард┐рди рд╣реИред рдЗрд╕рдХреА рдмреБрдирд┐рдпрд╛рджреА рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ рд╕рдордЭрдирд╛ рдФрд░ рд╕реАрдЦрдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдиреБрднрд╡реА рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрд╡рд▓рдкрд░ рдмрдирдиреЗ рдореЗрдВ рд╕рдордп рдФрд░ рдкреНрд░рдпрд╛рд╕ рд▓рдЧрддрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рд╕реНрдкреНрд░рд┐рдВрдЧ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЬреБрдбрд╝реА рдХреБрдЫ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рд░реЗрдбреА-рдЯреВ-рдпреВрдЬрд╝ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХреАрдХреГрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд▓реЗрдЦ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдЧрд╛ред рдпрд╣ рдХрдИ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рджреЗрдЧрд╛ рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдорд╛рдирдХ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред
рдпрджрд┐ рдЖрдк рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реЗ рдмрд╣реБрдд рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ GitHub рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдмрдирд╛рдИред рдпрджрд┐ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдПрдХ рдХреНрд▓реЛрди рдмрдирд╛рдиреЗ рдФрд░ рдЖрдкрдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ред
рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддреА # 6: рдПрдиреЛрдЯреЗрд╢рди-рдЖрдзрд╛рд░рд┐рдд рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛
рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рд╣рдорд╛рд░реА TopTalent рд╕реЗрд╡рд╛ рдХреЛ рдирдП TopTalent рдбреЗрдЯрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдирд╛рдо рдареАрдХ 10 рд╡рд░реНрдг рд▓рдВрдмрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
@RequestMapping("/put") public void addTopTalent(@RequestBody TopTalentData topTalentData) { boolean nameNonExistentOrHasInvalidLength = Optional.ofNullable(topTalentData) .map(TopTalentData::getName) .map(name -> name.length() == 10) .orElse(true); if (nameNonExistentOrInvalidLength) {
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рди рдХреЗрд╡рд▓ рдЦрд░рд╛рдм рд╕рдВрд░рдЪрд┐рдд рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рд╕реНрд╡рдЪреНрдЫ" рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рд╣рдо рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдХрд░рддреЗ рд╣реИрдВ (рдЕрд░реНрдерд╛рддреН, рд╣рдо рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐
TopTalentData
рдСрдмреНрдЬреЗрдХреНрдЯ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рдХрд┐ TopTalentData.name рдлрд╝реАрд▓реНрдб рдХрд╛ рдорд╛рди рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рдФрд░
TopTalentData.name
рдлрд╝реАрд▓реНрдб рдХреА рд▓рдВрдмрд╛рдИ 10 рд╡рд░реНрдг рд╣реИ), рдФрд░ рдбреЗрдЯрд╛ рдЧрд▓рдд рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдЕрдкрд╡рд╛рдж рднреА рдлреЗрдВрдХ рджреЗрдВред
рдпрд╣ рд╕рдм рд╡рд╕рдВрдд рдореЗрдВ
рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЪрд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ
addTopTalent
рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ
addTopTalent
, рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
@RequestMapping("/put") public void addTopTalent(@Valid @NotNull @RequestBody TopTalentData topTalentData) { topTalentService.addTopTalent(topTalentData); } @ExceptionHandler @ResponseStatus(HttpStatus.BAD_REQUEST) public ErrorResponse handleInvalidTopTalentDataException(MethodArgumentNotValidException methodArgumentNotValidException) {
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо
TopTalentData
рд╡рд░реНрдЧ рдореЗрдВ рдХреМрди рд╕реА рд╕рдВрдкрддреНрддрд┐ рд╕рддреНрдпрд╛рдкрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
public class TopTalentData { @Length(min = 10, max = 10) @NotNull private String name; }
рд╡рд╕рдВрдд рдЕрдм рдЕрдиреБрд░реЛрдз рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ рдФрд░ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдореИрдиреБрдЕрд▓ рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
рдЕрдкрдирд╛ рд▓рдХреНрд╖реНрдп рдмрдирд╛рдХрд░ рднреА рдЗрдЪреНрдЫрд┐рдд рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЖрдкрдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреА рдЬрд╝рд░реВрд░рддреЗрдВ
рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ
рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реЗрдЯ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИрдВ , рд▓реЗрдХрд┐рди рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐
@Length
рдПрдиреЛрдЯреЗрд╢рди рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред рдЖрдк рдПрдХ рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдХрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ: рдПрдХ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдФрд░ рджреВрд╕рд░рд╛ рдПрдиреЛрдЯреЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП:
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint(validatedBy = { MyAnnotationValidator.class }) public @interface MyAnnotation { String message() default "String length does not match expected"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; int value(); } @Component public class MyAnnotationValidator implements ConstraintValidator<MyAnnotation, String> { private int expectedLength; @Override public void initialize(MyAnnotation myAnnotation) { this.expectedLength = myAnnotation.value(); } @Override public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { return s == null || s.length() == this.expectedLength; } }
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рдкреГрдердХреНрдХрд░рдг рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рд╣реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╡реИрдз рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдпрджрд┐ рдЗрд╕рдХрд╛ рдорд╛рди рд╢реВрдиреНрдп рд╣реИ
(s == null
рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ
(s == null
рд╣реИ), рдФрд░ рдлрд┐рд░ рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП
isValid
рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
public class TopTalentData { @MyAnnotation(value = 10) @NotNull private String name; }
рдХреЙрдорди рдорд┐рд╕реНрдЯреЗрдХ # 7: рд▓рд┐рдЧреЗрд╕реА рдПрдХреНрд╕рдПрдордПрд▓-рдЖрдзрд╛рд░рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп XML рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рд▓реЗрдХрд┐рди рдЕрдм рдЬрд╛рд╡рд╛ рдХреЛрдб рдФрд░ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред XML рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЕрдм рдЕрддрд┐рд░рд┐рдХреНрдд рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ (рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕рд╛рдереА GitHub рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕рд╛рдордЧреНрд░реА рдореЗрдВ), рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ JavaBean рдШрдЯрдХреЛрдВ рдХреЛ рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд░реВрдЯ рдкреИрдХреЗрдЬ рдХреЛ @Spring.ootApplication рд╕рдордЧреНрд░ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЗрд╕ рддрд░рд╣:
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
рдпрд╣ рд╕рдордЧреНрд░ рдПрдиреЛрдЯреЗрд╢рди (рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ
рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рджреЗрдЦреЗрдВ) рдмрд╕ рд╕реНрдкреНрд░рд┐рдВрдЧ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдкреИрдХреЗрдЬ рдЬрд╛рд╡рд╛рдмреАрди рдШрдЯрдХреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреИрди рдХрд░рдирд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд co.kukurin рдЙрдк-рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕
@Configuration
рдПрдиреЛрдЯреЗрд╢рди рд╡рд╛рд▓реА рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рд╡рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рднреА рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддреА # 8: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛
рд╕рд░реНрд╡рд░ рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛ рд╡рд┐рднрд┐рдиреНрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░ рд░рд╣реА рд╣реИ (рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпреЗ рдкрд░рд┐рдЪрд╛рд▓рди рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИрдВ)ред рдкрд░реАрдХреНрд╖рдг рдФрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рдореЛрдб рдХреЗ рдмреАрдЪ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдХреНрд░рдордг рдкрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реИред
рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬрдм рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рдкрд░рд┐рд╡реЗрд╢ рдореЗрдВ рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд░реИрдо рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ MySQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ URL рдФрд░, рд╕рдВрднрд╡рддрдГ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕реЗ рджреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдлрд╝рд╛рдЗрд▓ рдЖрд╡реЗрджрди # set default profile to 'dev' spring.profiles.active: dev # production database details spring.datasource.url: 'jdbc:mysql://localhost:3306/toptal' spring.datasource.username: root spring.datasource.password:
рдлрд╝рд╛рдЗрд▓ рдЖрд╡реЗрджрди- DEV.YAML spring.datasource.url: 'jdbc:h2:mem:' spring.datasource.platform: h2
рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рд┐рдпрд╛рдПрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд┐рдХрд╛рд╕ рд╡рд╛рддрд╛рд╡рд░рдг (DEV) рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ JVM рдХреЗ рд▓рд┐рдП
-Dspring.profiles.active=prod
рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреЛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддреА рд╕рдВрдЦреНрдпрд╛ 9. рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛
рд╡рд╕рдВрдд рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рддрдВрддреНрд░ рдХреЗ рд╕рдореБрдЪрд┐рдд рдЙрдкрдпреЛрдЧ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡рд╕рдВрдд рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╕реНрдХреИрди рдХрд░рдХреЗ рдЖрдкрдХреА рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрд╛рдВрдз рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЕрдиреНрдпреЛрдиреНрдпрд╛рд╢реНрд░рд┐рддрддрд╛рдУрдВ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдХрд╕рдХрд░ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:
public class TopTalentController { private final TopTalentService topTalentService; public TopTalentController() { this.topTalentService = new TopTalentService(); } }
... рд╣рдо рд╡рд╕рдВрдд рдордВрдЪ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ:
public class TopTalentController { private final TopTalentService topTalentService; public TopTalentController(TopTalentService topTalentService) { this.topTalentService = topTalentService; } }
Google рдЯреЗрдХ рдЯреЙрдХреНрд╕ рдЪреИрдирд▓ рдкрд░ рдорд┐рд╢рдХреЛ рд╣реЗрд╡рд░реА рдХреЗ рд╡реНрдпрд╛рдЦреНрдпрд╛рди рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрд╣рд╛рдВ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рддрдВрддреНрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рд╡рд┐рднрд╛рдЬрди рдореЗрдВ ("рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддреА # 3"), рд╣рдордиреЗ рд╕реЗрд╡рд╛ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐
TopTalentService
рд╡рд░реНрдЧ рд╕рд╣реА рдврдВрдЧ
TopTalentService
рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣рдо рд╡рд░реНрддрдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрд▓рдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреНрд▓рд╛рд╕ рдмрдирд╛рдХрд░ рдПрдХ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
@Configuration public class SampleUnitTestConfig { @Bean public TopTalentService topTalentService() { TopTalentService topTalentService = Mockito.mock(TopTalentService.class); Mockito.when(topTalentService.getTopTalent()).thenReturn( Stream.of("Mary", "Joel").map(TopTalentData::new).collect(Collectors.toList())); return topTalentService; } }
рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд╕реНрдкреНрд░рд┐рдВрдЧ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЛ
SampleUnitTestConfig
рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ
SampleUnitTestConfig
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
@ContextConfiguration(classes = { SampleUnitTestConfig.class })
рдЗрд╕рдХреЗ рдмрд╛рдж, рдпрд╣ рд╣рдореЗрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХрд╕реНрдЯрдо рдЬрд╛рд╡рд╛рдмреАрди рдШрдЯрдХ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддреА рд╕рдВрдЦреНрдпрд╛ 10. рдкрд░реАрдХреНрд╖рдг рдпрд╛ рдЧрд▓рдд рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЕрднрд╛рд╡
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирдпрд╛ рдирд╣реАрдВ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдпрд╛ рддреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ "рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ" (рд╡рд┐рд╢реЗрд╖рдХрд░ рдпрджрд┐ рдпрд╣
рдЕрдирд┐рд╡рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ ) рдпрд╛ рдЗрд╕реЗ рдмрд╣реБрдд рджреЗрд░ рд╕реЗ рдЦрд░реНрдЪ рдХрд░рддреЗ рд╣реИрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдЧрд▓рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рди рдХреЗрд╡рд▓ рдЖрдкрдХреЛ рдХреЛрдб рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрд╡реЗрджрди рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╡реЗрдм рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп, рдЖрдк рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЕрд╕рд╛рдзрд╛рд░рдг рд░реВрдк рд╕реЗ "рдХреНрд▓реАрди" рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЖрдорддреМрд░ рдкрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ
DispatcherServlet
рд╕рд░реНрд╡рд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ
HttpServletRequest
рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, рдпрд╣
рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рд╕рддреНрдпрд╛рдкрди, рдХреНрд░рдорд╛рдВрдХрди, рдЖрджрд┐)ред рдПрдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдФрд░ рд╕рд┐рджреНрдз рд╕рдорд╛рдзрд╛рди рд╣реИ, MESTMVC рдХреЗ рд╕рд╛рде REST рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЯреБрдХрдбрд╝рд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { Application.class, SampleUnitTestConfig.class }) public class RestAssuredTestDemonstration { @Autowired private TopTalentController topTalentController; @Test public void shouldGetMaryAndJoel() throws Exception {
SampleUnitTestConfig
TopTalentService
рд╡рд░реНрдЧ рдХреЗ рд╕рд░реЛрдЧреЗрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ
TopTalentService
рдХреЗ рд▓рд┐рдП
TopTalentController
, рдФрд░ рдЕрдиреНрдп рд╕рднреА рд╡рд░реНрдЧ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд░реНрдЧ рдХреЗ рдкреИрдХреЗрдЬ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдХреИрдирд┐рдВрдЧ рд╕рдВрдХреБрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдорд╛рдирдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реЛрддреЗ рд╣реИрдВред
RestAssuredMockMvc
рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╣рд▓реНрдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдФрд░
/toptal/get
GET
рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рд╡рд╕рдВрдд рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдордВрдЪ рд╣реИ рдЬрд┐рд╕рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдФрд░ рдХреБрдЫ рдкреНрд░рдпрд╛рд╕ рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЕрдВрдд рдореЗрдВ рдпрд╣ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдЖрдкрдХреЗ рдХрд╛рдо рдХреА рджрдХреНрд╖рддрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░реЗрдЧрд╛, рдЖрдкрдХреЛ рдХреНрд▓реАрдирд░ рдХреЛрдб рдмрдирд╛рдиреЗ рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреА рдпреЛрдЧреНрдпрддрд╛ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк
рд╕реНрдкреНрд░рд┐рдВрдЧ рдЗрди рдПрдХреНрд╢рди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ - рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА, рдЕрдиреБрдкреНрд░рдпреЛрдЧ-рдЙрдиреНрдореБрдЦ рдкреБрд╕реНрддрдХ рд╣реИ рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╖рдпреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреА рд╣реИред
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред
рдкрд╣рд▓рд╛ рднрд╛рдЧ рдкрдврд╝реЗрдВ