рдкрд░реАрдХреНрд╖рдг-рд╕рдВрдЪрд╛рд▓рд┐рдд рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдкрд░ рдкреИрд╕реЗ рдХреИрд╕реЗ рдмрдЪрд╛рдПрдВ

рдХреНрдпрд╛ рдЖрдкрдХреА рдХрднреА рдпрд╣ рд╣рд╛рд▓рдд рд╣реБрдИ рд╣реИ?

рдЫрд╡рд┐

рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ TDD рдХреИрд╕реЗ рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдЬреЛ рдХреБрдЫ рднреА рдорд┐рд▓рд╛ рд╡рд╣ рдХрд╛рдлреА рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдерд╛ред
рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдореИрдВ рджреЛ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдЖ: рдПрдХ рд╢рд╛рд╕реНрддреНрд░реАрдп рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рддрдм TDD рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рдерд╛, рдФрд░ рджреВрд╕рд░рд╛ - рд╕рд┐рд░реНрдл TDD рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред

рдиреАрдЪреЗ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдЕрдВрддрд░ рдХрд╣рд╛рдВ рдереЗред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рдХрд┐рд╕реА рдиреЗ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдмрдЧ рдкрд╛рдпрд╛, рддреЛ рдореИрдВрдиреЗ рдЖрддреНрдо-рд╕рдореНрдорд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рднрд╛рд░реА рдорд╛рдЗрдирд╕ рдХреЛ рдкрдХрдбрд╝рд╛ред рд╣рд╛рдВ, рдореИрдВ рд╕рдордЭ рдЧрдпрд╛ рдХрд┐ рдХреАрдбрд╝реЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ, рд╣рд░ рдХреЛрдИ рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣реАрдирддрд╛ рдХреА рднрд╛рд╡рдирд╛ рджреВрд░ рдирд╣реАрдВ рд╣реБрдИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реЗрд╡рд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореБрдЭреЗ рдХрднреА-рдХрднреА рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВрдиреЗ рдЦреБрдж рдПрдХ рдРрд╕рд╛ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рд╣рд╛рдереЛрдВ рдХреЛ рдЦреБрдЬрд▓реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдлреЗрдВрдХ рджреЗрдирд╛ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ред рдФрд░ рдпрд╣ рдХреИрд╕реЗ рд╣реБрдЖ рдпрд╣ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред рдХрд┐рд╕реА рддрд░рд╣ рд╕рдм рдХреБрдЫ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдареАрдХ рдерд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рдж рдФрд░ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рдмрд╛рдж рдЖрдк рдЖрдБрд╕реВ рдХреЗ рдмрд┐рдирд╛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрджрд▓рд╛рд╡ рдХрд╛ рд╣рд░ рдХрджрдо рддрд░реНрдХрд╕рдВрдЧрдд рдерд╛ред рдЬрд┐рд╕ рднрд╛рд╡рдирд╛ рдХреЛ рдореИрдВ рдЕрдкрдиреЗ рдХрд╛рдо рдХрд╛ рдЙрддреНрдкрд╛рдж рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛, рд╡рд╣ рдЗрд╕ рднрд╛рд╡рдирд╛ рдореЗрдВ рд╕рд╣рдЬрддрд╛ рд╕реЗ рдкреНрд░рд╡рд╛рд╣рд┐рдд рд╣реЛ рдЬрд╛рддреА рдереА рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдореБрдЭ рд╕реЗ рд╣реИ, рдореБрдЭреЗ рдмрд╣рд╛рдиреЗ рджреЗрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЧрдВрджрдЧреА рд╕реЗ рдирд┐рдХрд▓реА рдЧреЛрд▓реАред

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореИрдВ рдЕрдХреЗрд▓рд╛ рдирд╣реАрдВ рд╣реВрдВ рдФрд░ рдореЗрд░реЗ рдХрдИ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреА рд╕рдВрд╡реЗрджрдирд╛рдПрдВ рд╕рдорд╛рди рд╣реИрдВред рдФрд░ рдлрд┐рд░ рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╛ рддреЛ рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╕реАрдЦреВрдВрдЧрд╛, рдпрд╛ рдпрд╣ рдореЗрд░рд╛ рдкреЗрд╢рд╛ рдмрджрд▓рдиреЗ рдХрд╛ рд╕рдордп рдерд╛ред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХреБрдЫ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг-рд╕рдВрдЪрд╛рд▓рд┐рдд рд╡рд┐рдХрд╛рд╕ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред

рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ TDD рдПрдХ рдХреНрд▓реАрдирд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рднреА рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред

рдлрд┐рд░ рд╕реЗ рдЯреАрдбреАрдбреА рдХреНрдпрд╛ рд╣реИ


рдЫрд╡рд┐


рдЯреАрдбреАрдбреА - рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдХрд╛рд╕ред рд╡рд┐рдХреА рд▓реЗрдЦ рдпрд╣рд╛рдБ ред
рдХреНрд▓рд╛рд╕рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╣рд▓реЗ рдПрдХ рдЖрд╡реЗрджрди рд▓рд┐рдЦрдирд╛ рд╣реИ, рдлрд┐рд░ рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╡рд░ рдХрд░реЗрдВред

рдЯреАрдбреАрдбреА рджреГрд╖реНрдЯрд┐рдХреЛрдг - рдкрд╣рд▓реЗ рд╣рдо рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рд╣рдо рдЕрдореВрд░реНрдд рдХреЗ рд╕реНрддрд░реЛрдВ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ - рдЙрдЪреНрдЪрддрдо рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рддрдХ, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкрд░рддреЛрдВ-рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рддреЛрдбрд╝рдХрд░ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╣рдо рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЖрджреЗрд╢ рджреЗрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдореБрдХреНрдд рд╣реЛрдирд╛ред

рдФрд░ рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдкрд╣рд▓реА рдмрд╛рд░ рдкрдврд╝рддрд╛ рддреЛ рдореБрдЭреЗ рдХреБрдЫ рднреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ред
рдмрд╣реБрдд рд╕рд╛рд░ рд╢рдмреНрдж: рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред
рд╣рдо рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╕рдВрдд рдЖрд╡реЗрджрди рд▓рд┐рдЦреЗрдВрдЧреЗ, рд╣рдо рдЗрд╕реЗ рдЯреАрдбреАрдбреА рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдФрд░ рдореИрдВ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдФрд░ рдЕрдВрдд рдореЗрдВ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЯреАрдбреАрдбреА рдкрд░ рд╕рдордп рдмрд┐рддрд╛рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдп


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдЗрддрдиреЗ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ TOR рд╣реИред рдЖрдорддреМрд░ рдкрд░, рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЗрд╕рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬреЛ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдШрд░ рдкрд░ рдмрд╛рдж рдореЗрдВ рдбрд┐рд▓реАрд╡рд░реА рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рди рдмреЗрдЪрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рддреГрддреАрдп-рдкрдХреНрд╖ рдбреЗрдЯрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рднреЗрдЬреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рд╡реНрдпрд╡рд╕рд╛рдп рддрд░реНрдХ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ: рдпрджрд┐ рдХреЛрдИ рд╡рд╕реНрддреБ рдмрд┐рдХреНрд░реА рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ рддреЛ:

  • рдЙрддреНрдкрд╛рдж рд╕реНрдЯреЙрдХ рдореЗрдВ рд╣реИ
  • рдареЗрдХреЗрджрд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдВрдкрдиреА DostavchenKO) рдХреЗ рдкрд╛рд╕ рдЗрд╕реЗ рдЧреНрд░рд╛рд╣рдХ рддрдХ рд▓реЗ рдЬрд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ
  • рдЙрддреНрдкрд╛рдж рдХрд╛ рд░рдВрдЧ - рдиреАрд▓рд╛ рдирд╣реАрдВ (рд╣рдореЗрдВ рдиреАрд▓рд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ)

рд╣рдорд╛рд░реЗ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрд░реНрдлрд╝ рдХреЛ http-request рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдЯреЛрд░ рд╢реЗрд▓реНрдл рдкрд░ рдорд╛рд▓ рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рд╕реВрдЪрдирд╛ рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░рд┐рдЧрд░ рд╣реИред

рдкреНрд▓рд╕, рддрд╛рдХрд┐ рдЬреАрд╡рди рд╢рд╣рдж рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ:

  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреБрдЫ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • DATA рдХреЛ рд╕реНрдкреИрдо рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЙрди рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдзрддрд╛ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдмрджрд▓ рдЧрдП рд╣реИрдВред

рд╣рдо рдЯреАрдХреЗ рдХреЗ рдХреБрдЫ рд╕рдордп рдкрдврд╝рддреЗ рд╣реИрдВ - рдФрд░ рдЬрд╛рддреЗ рд╣реИрдВред



рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг


рдЯреАрдбреАрдбреА рдореЗрдВ, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬреЛ рдЖрдкрдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реИ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реИ: "рдореБрдЭреЗ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП ...?"

рдФрд░ рдкрд╣рд▓рд╛ рд╕рд╡рд╛рд▓ рдЬреЛ рд╣рдо рдкреВрдЫрддреЗ рд╣реИрдВ рд╡рд╣ рд╕рд┐рд░реНрдл рдкреВрд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд╣реИред
рддреЛ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ:

рдореИрдВ рдЕрдкрдиреЗ рдорд╛рдЗрдХреНрд░реЛ рд╕рд░реНрд╡рд┐рд╕ рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ?

рдЙрддреНрддрд░ рд╣реИ:

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬреЗрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдРрд╕реЗ рд╕рд░рд▓ рддрд░реНрдХ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрди рд╕рднреА рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдЕрдзрд┐рдХ, рдПрдХ рдЕрд╕рдВрднрд╡ рдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрд╡реЗрджрди рд╕реНрддрд░ рдкрд░ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдореБрдЦреНрдп рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВрдЧреЗред

рдпрд╣реА рд╣реИ, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рд╡реИрдз рдкреНрд░рд╛рд░реВрдк рд╣реИрдВ, рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╕рд┐рд╕реНрдЯрдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкрд╣рд▓реЗ рдЙрддреНрдкрд╛рдж рдкрд░ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдереАред

рддреЛ, рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

  • рдПрдХ рдШрдЯрдирд╛ рд╕рд╛рдордиреЗ рдЖрдИ рд╣реИ рдХрд┐ рд╢реЗрд▓реНрдл рдкрд░ рдХреЛрдИ рдЙрддреНрдкрд╛рдж рдирд╣реАрдВ рд╣реИред рд╕реВрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡рд┐рддрд░рдг рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИред
  • рдпрд╣ рдШрдЯрдирд╛ рдЖрдИ рдХрд┐ рдкреАрд▓рд╛ рдЙрддреНрдкрд╛рдж рд╕реНрдЯреЙрдХ рдореЗрдВ рд╣реИ, рджреЛрд╕реНрддреЛрд╡рдЪреЗрдиреЛ рдЗрд╕реЗ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдорд╛рд▓ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВред
  • рджреЛ рд╕рдВрджреЗрд╢ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЖрдП - рджреЛрдиреЛрдВ рд╕реНрдЯреЛрд░ рдореЗрдВ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╕рд╛рдорд╛рди рдХреЗ рд╕рд╛рдеред рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ред
  • рджреЛ рд╕рдВрджреЗрд╢ рдкрд╣реБрдВрдЪреЗ: рдкрд╣рд▓реЗ рдореЗрдВ рд╕реНрдЯреЛрд░ рдореЗрдВ рдПрдХ рдЙрддреНрдкрд╛рдж рд╣реИ, рджреВрд╕рд░реЗ рдореЗрдВ - рдпрд╣ рдЕрдм рдирд╣реАрдВ рд╣реИред рд╣рдо рджреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ: рдкрд╣рд▓рд╛ - рдЙрдкрд▓рдмреНрдз, рдлрд┐рд░ - рдирд╣реАрдВред
  • рдореИрдВ рдЙрддреНрдкрд╛рдж рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рд╕реВрдЪрдирд╛рдПрдВ рдЕрдм рдирд╣реАрдВ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИрдВред
  • ...

рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдЪреАрдЬ рд╕рдордп рдореЗрдВ рд░реБрдХрдирд╛ рд╣реИ: рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рд╣реИ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдФрд░ рдпрд╣ рдЙрди рд╕рднреА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ - рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреАред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЬрдм рд╣рдо рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЙрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╣рдо рдпрд╣рд╛рдВ рд▓рд╛рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдкреНрд░реЗрд░рдгрд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдпреЗ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрд╡реЗрджрди рд╣рдорд╛рд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЗрди рд╕рднреА рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рдХреЛ рд╣рдо рдЕрдм рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдбрд┐рд╕реНрдЯрд┐рд▓ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдВрдХрд┐ рдпрд╣ рдЖрд╡реЗрджрди рдХреЗ рд╕реНрддрд░ рдкрд░ рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╕рдВрдд рд╕рдВрджрд░реНрдн рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рд╣реЛрдВрдЧреЗ, рдЕрд░реНрдерд╛рддреН, рдХрд╛рдлреА рднрд╛рд░реАред
рдФрд░ рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХрдИ рдЯреАрдбреАрдбреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд▓реЛрдЧ рд╣рдореЗрд╢рд╛ рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ рд╣рд╛рдВ, рдпрд╣ рд╕рдмрд╕реЗ рдХрдард┐рди рдХрджрдо рд╣реИ, рд▓реЗрдХрд┐рди, рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛ, рдЬрдм рдЖрдк рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рд▓рдЧрднрдЧ рдЦреБрдж рд╣реА рд▓рд┐рдЦ рджреЗрдЧрд╛, рдФрд░ рдЖрдкрдХреЛ рдпрдХреАрди рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдЖрд╡реЗрджрди рдЖрдкрдХреЗ рдЗрдЪреНрдЫрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд░реЗрдЧрд╛ред


рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдЗрдирд┐рд╢рд┐рд░ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд░реАрдХреНрд╖рдг рдХреЗ рдирд╛рдо рд╕рд┐рд░реНрдл рд╣рдорд╛рд░реА рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рд╣реИрдВред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЦрд╛рд▓реА рддрд░реАрдХреЗ рдмрдирд╛рдПрдБ:

@Test public void notifyNotAvailableIfProductQuantityIsZero() {} @Test public void notifyAvailableYellowProductIfPositiveQuantityAndDostavchenkoApproved() {} @Test public void notifyOnceOnSeveralEqualProductMessages() {} @Test public void notifyFirstAvailableThenNotIfProductQuantityMovedFromPositiveToZero() {} @Test public void noNotificationOnDisabledProduct() {} 

рддрд░реАрдХреЛрдВ рдХреЗ рдирд╛рдордХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдореИрдВ рдЖрдкрдХреЛ рдЬреЛрд░рджрд╛рд░ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЯреЗрд╕реНрдЯ 1 (), рдЯреЗрд╕реНрдЯ 2 () рдХреЗ рдмрдЬрд╛рдп рд╕реВрдЪрдирд╛рддреНрдордХ рдмрдирд╛рдПрдВ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рдж рдореЗрдВ, рдЬрдм рдЖрдк рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдиреЗ рдХрд┐рд╕ рд╡рд░реНрдЧ рдХреЛ рд▓рд┐рдЦрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЕрд╡рд╕рд░ рдорд┐рд▓реЗрдЧрд╛ рдХреЛрдб рдХреЛ рд╕реАрдзреЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рдмрд╕ рдкрд░реАрдХреНрд╖рдг рдЦреЛрд▓реЗрдВ рдФрд░ рдЕрдиреБрдмрдВрдз рд╡рд┐рдзрд┐ рдкрдврд╝реЗрдВ рдЬреЛ рдХрдХреНрд╖рд╛ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреА рд╣реИред

рдкрд░реАрдХреНрд╖рдг рднрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ


рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдмрд╛рд╣рд░реА рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рд╣реИред

рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ "рдмрд╛рд╣рд░реА" рд╡рд╣ рд╕рдм рд╣реИ рдЬреЛ рд╕реНрд╡рдпрдВ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реАрдзреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд╛рд╣рд░реА рд╣реИ:

  • рд╡рд╣ рдкреНрд░рдгрд╛рд▓реА рдЬреЛ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдорд╛рд▓ рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░реЗрдЧреА
  • рдЧреНрд░рд╛рд╣рдХ рдЬреЛ рд╕рд╛рдорд╛рди рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд╛рдЯ рджреЗрдЧрд╛
  • рддреГрддреАрдп-рдкрдХреНрд╖ DostavchenKO рдкреНрд░рдгрд╛рд▓реА

рдкрд╣рд▓реЗ рджреЛ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдкреНрд░рд┐рдВрдЧрд┐рдВрдЧ MockMvc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
DostavchenKO рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рд╡рд╛рдпрд░рдореЙрдХ рдпрд╛ MockRestServiceServer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░рд╛ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг
 @RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc @AutoConfigureWireMock(port = 8090) public class TddExampleApplicationTests { @Autowired private MockMvc mockMvc; @Before public void init() { WireMock.reset(); } @Test public void notifyNotAvailableIfProductQuantityIsZero() throws Exception { stubNotification( // language=JSON "{\n" + " \"productId\": 111,\n" + " \"available\": false\n" + "}"); performQuantityUpdateRequest( // language=JSON "{\n" + " \"productId\": 111,\n" + " \"color\" : \"red\", \n" + " \"productQuantity\": 0\n" + "}"); verify(1, postRequestedFor(urlEqualTo("/notify"))); } @Test public void notifyAvailableYellowProductIfPositiveQuantityAndDostavchenkoApproved() throws Exception { stubDostavchenko("112"); stubNotification( // language=JSON "{\n" + " \"productId\": 112,\n" + " \"available\": true\n" + "}"); performQuantityUpdateRequest( // language=JSON "{\n" + " \"productId\": 112,\n" + " \"color\" : \"Yellow\", \n" + " \"productQuantity\": 10\n" + "}"); verify(1, postRequestedFor(urlEqualTo("/notify"))); } @Test public void notifyOnceOnSeveralEqualProductMessages() throws Exception { stubDostavchenko("113"); stubNotification( // language=JSON "{\n" + " \"productId\": 113,\n" + " \"available\": true\n" + "}"); for (int i = 0; i < 5; i++) { performQuantityUpdateRequest( // language=JSON "{\n" + " \"productId\": 113,\n" + " \"color\" : \"Yellow\", \n" + " \"productQuantity\": 10\n" + "}"); } verify(1, postRequestedFor(urlEqualTo("/notify"))); } @Test public void notifyFirstAvailableThenNotIfProductQuantityMovedFromPositiveToZero() throws Exception { stubDostavchenko("114"); stubNotification( // language=JSON "{\n" + " \"productId\": 114,\n" + " \"available\": true\n" + "}"); performQuantityUpdateRequest( // language=JSON "{\n" + " \"productId\": 114,\n" + " \"color\" : \"Yellow\",\n" + " \"productQuantity\": 10\n" + "}"); stubNotification( // language=JSON "{\n" + " \"productId\": 114,\n" + " \"available\": false\n" + "}"); performQuantityUpdateRequest( // language=JSON "{\n" + " \"productId\": 114,\n" + " \"color\" : \"Yellow\",\n" + " \"productQuantity\": 0\n" + "}"); verify(2, postRequestedFor(urlEqualTo("/notify"))); } @Test public void noNotificationOnDisabledProduct() throws Exception { stubNotification( // language=JSON "{\n" + " \"productId\": 115,\n" + " \"available\": false\n" + "}"); disableProduct(115); for (int i = 0; i < 5; i++) { performQuantityUpdateRequest( // language=JSON "{\n" + " \"productId\": 115,\n" + " \"color\" : \"Yellow\",\n" + " \"productQuantity\": " + i + "\n" + "}"); } verify(1, postRequestedFor(urlEqualTo("/notify"))); } private void disableProduct(int productId) throws Exception { mockMvc.perform( post("/disableProduct?productId=" + productId) ).andDo( print() ).andExpect( status().isOk() ); } private void performQuantityUpdateRequest(String content) throws Exception { mockMvc.perform( post("/product-quantity-update") .contentType(MediaType.APPLICATION_JSON) .content(content) ).andDo( print() ).andExpect( status().isOk() ); } private void stubNotification(String content) { stubFor(WireMock.post(urlEqualTo("/notify")) .withHeader("Content-Type", equalTo(MediaType.APPLICATION_JSON_UTF8_VALUE)) .withRequestBody(equalToJson(content)) .willReturn(aResponse().withStatus(HttpStatus.OK_200))); } private void stubDostavchenko(final String productId) { stubFor(get(urlEqualTo("/isDeliveryAvailable?productId=" + productId)) .willReturn(aResponse().withStatus(HttpStatus.OK_200).withBody("true"))); } } 

рдмрд╕ рдХреНрдпрд╛ рд╣реБрдЖ?


рд╣рдордиреЗ рдПрдХ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдорд╛рд░реНрдЧ рд╣рдореЗрдВ рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕рдВрдЪрд╛рд▓рди рдХреНрд╖рдорддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред рдФрд░ рд╣рдордиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдерд╛ рдЬрдм рд╣рдо рд╕реЗрд╡рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдлрд╛рдпрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рд▓реЗрдЦрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ DostavchenKO рдкрд░ рдЬрд╛рдирд╛ рдерд╛ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдерд╛ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЕрдкрдиреЗ рд╕реНрдЯрдм рдореЗрдВ рдмрдирд╛рдпрд╛ рдерд╛ред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрд╛, рди рдХрд┐ рд╕рднреА рдХреЛрдб рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рджред рдФрд░ рдпрд╣рд╛рдВ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╛рд░реВрдк рдЯреАрдУрдЖрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рд╕реЗрд╡рд╛ рдЖрдо рддреМрд░ рдкрд░ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИ, рдпрд╛ рдХреБрдЫ рдФрд░ рд╣реИред

рдореИрдВ рдпрд╣ рднреА рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдордиреЗ рди рдХреЗрд╡рд▓ рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рд▓рд┐рдЦреА рд╣реИ, рдЬреЛ рдмрд╛рдж рдореЗрдВ рдареЗрд╕ рдкрд░ рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдпрд╣ рднреА рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЛ рдЕрдВрджрд░ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: рдХреНрдпрд╛ рдкрд░рддреЗрдВ рд╣реЛрдВрдЧреА, рдХреНрдпрд╛ рд╣рдо рдЖрдзрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреМрди рд╕рд╛, рдЖрджрд┐ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдордп, рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЕрдореВрд░реНрдд рд╣реИрдВ, рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ, рдпрд╣ рдХрдИ рд╡рд╛рд╕реНрддреБ рд▓рд╛рдн рджреЗ рд╕рдХрддрд╛ рд╣реИред

рд╡рд┐рд╣рд┐рдд рдЯреАрдбреАрдбреА рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд╣рд╛рдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╕рдордп рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдмрд╣реБрдд рдЕрдВрдд рддрдХ рд╣рд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕рд╣рд┐рдд рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдм рдХреБрдЫ рд▓рд┐рдЦрд╛ рди рдЬрд╛рдПред
рд╣рдо рдФрд░ рдЖрдЧреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

рдирд┐рдпрдВрддреНрд░рдХ


рдЬрдм рд╣рдордиреЗ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрд╛ рдФрд░ рдЕрдм рд╣рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдп рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд░рд╛рдд рдХреЛ рд╢рд╛рдВрддрд┐ рд╕реЗ рд╕реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд░рддреЛрдВ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдФрд░ рдкрд╣рд▓реА рдкрд░рдд рдЬрд┐рд╕реЗ рд╣рдо рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рд╡рд╣ рдирд┐рдпрдВрддреНрд░рдХ рд╣реИред рдЖрдЦрд┐рд░ рд╡рд╣ рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИред рд╣рдореЗрдВ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдкрд╣рд▓реА рдкрд░рдд рд╕реЗ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдВрдд рддрдХ, рдмрд╛рддрдЪреАрдд рдХрд░реЗрдЧрд╛ред
рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдФрд░ рдлрд┐рд░, рдпрд╣ рд╕рдм рдПрдХ рд╣реА рд╕рд╡рд╛рд▓ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:

рдореБрдЭреЗ рдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?

рдЙрддреНрддрд░ рд╣реИ:

рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рд╕рддреНрдпрд╛рдкрди рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИред рддреЛ рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

  • рдЕрдорд╛рдиреНрдп рдЖрдИрдбреА рд╡рд╛рд▓реЗ рдЙрддреНрдкрд╛рдж рдХреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп BAD_REQUEST рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛
  • BAD_REQUEST рдЕрдорд╛рдиреНрдп рдЖрдИрдбреА рд╡рд╛рд▓реЗ рдорд╛рд▓ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп
  • рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рддреНрд░рд╛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп BAD_REQUEST
  • рдЕрдЧрд░ DostavchenKO рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИ, рддреЛ INTERNAL_SERVER_ERROR
  • DATA рдХреЛ рднреЗрдЬрдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реЛрдиреЗ рдкрд░, INTERNAL_SERVER_ERROR

рдЪреВрдВрдХрд┐ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП, http рдХреЛрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдХрд╕реНрдЯрдо рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╣ рд╕рдордЭ рд╕рдХреЗ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИред

  • 200 рдЕрдЧрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдлрд▓ рд░рд╣рд╛
  • рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде INTERNAL_SERVER_ERROR, рддрд╛рдХрд┐ рд╕реНрдЯреИрдХреНрд░реЗрд╕ рдХреЛ рди рдЪрдордХрд╛рдпрд╛ рдЬрд╛рдП

рдЬрдм рддрдХ рдореИрдВрдиреЗ рдЯреАрдбреАрдбреА рдкрд░ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдпрд╛, рддрдм рддрдХ рдореИрдВ рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдореЗрд░рд╛ рд╕рд┐рд╕реНрдЯрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдФрд░ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреНрдпрд╛ рд▓рд╛рдПрдЧрд╛ред рдореИрдВрдиреЗ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ - рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдмрд┐рд▓реНрдХреБрд▓ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдХрднреА-рдХрднреА рдорд╕реНрддрд┐рд╖реНрдХ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд░реИрдо рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдФрд░ рд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рдж, рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЬрд┐рд╕реЗ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗ рдЕрднреА рднреА рдПрдХ рдЦреБрд╢реА рд╣реИ: рд╣рдо рд╕рднреА рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдПрдХрджрдо рд╕рд╣реА рдХреЛрдб рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреЛрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рджрд░реНрдж рдирд╣реАрдВ рд╣реИ, рдпрджрд┐ рдРрд╕рд╛ рд╣реИред рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд╕рд┐рддрд╛рд░реЛрдВ рдХреЗ рдЕрднрд┐рд╕рд░рдг рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдареЗрд╕ рд╡рд╛рдкрд╕ рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж, рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдПрдЧрд╛ред рдФрд░ рдпрд╣ рди рдХреЗрд╡рд▓ рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ


рдкрд╣рд▓реЗ рддреАрди рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рд╣рдо рд╡рд╕рдВрдд рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рдХреЛрдИ рдЕрд╡реИрдз рдЕрдиреБрд░реЛрдз рдЖрддрд╛ рд╣реИ, рддреЛ рдЖрд╡реЗрджрди рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдо рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдкрдХрдбрд╝ рд▓реЗрдВрдЧреЗред рдпрд╣рд╛рдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рддреГрддреАрдп-рдкрдХреНрд╖ рдкреНрд░рдгрд╛рд▓реА рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИ?

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд╕реНрд╡рдпрдВ рддреГрддреАрдп-рдкрдХреНрд╖ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдкреВрдЫрдирд╛ рд╣реИ рдФрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреНрдпрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдордзреНрдпрд╕реНрде рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдордзреНрдпрд╕реНрде рд╕реЗрд╡рд╛ рд╣реИред рдФрд░ рд╣рдо рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЗ рдореЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВрдЧреЗ, рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рд╕реЗрд╡рд╛ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИред рдЖрдк рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд╕реНрдЯрдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдлреЗрдВрдХрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ред рд╣рдо рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВрдЧреЗред

рддреГрддреАрдп-рдкрдХреНрд╖ рдбреЗрдЯрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг
 @RunWith(SpringRunner.class) @WebMvcTest @AutoConfigureMockMvc public class ControllerTest { @MockBean private UpdateProcessorService updateProcessorService; @Test public void returnServerErrorOnDataCommunicationError() throws Exception { doThrow(new DataCommunicationException()).when(updateProcessorService).processUpdate(any(Update.class)); performUpdate( //language=JSON "{\n" + " \"productId\": 1,\n" + " \"color\": \"red\",\n" + " \"productQuantity\": 10\n" + "}" ).andDo( print() ).andExpect( status().isInternalServerError() ).andExpect( content().json("{\n" + " \"errors\": [\n" + " {\n" + " \"message\": \"Can't communicate with Data system\"\n" + " }\n" + " ]\n" + "}") ); } } 


рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдХрдИ рдЪреАрдЬреЗрдВ рдЕрдкрдиреЗ рдЖрдк рд╕рд╛рдордиреЗ рдЖрдИрдВ:

  • рдПрдХ рд╕реЗрд╡рд╛ рдЬрд┐рд╕реЗ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЬрд┐рд╕реЗ рдПрдХ рдирдИ рдорд╛рддреНрд░рд╛ рдХреЗ рд╕рд╛рдорд╛рди рдХреЗ рд▓рд┐рдП рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рдПрдЧрд╛ред
  • рдЗрд╕ рд╕реЗрд╡рд╛ рдХреА рд╡рд┐рдзрд┐, рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдЗрд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░, рдЬреЛ рдЗрд╕ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░реЗрдВрдЧреЗред
  • рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдкрд░ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╕реНрдЯрдо рдирд┐рд╖реНрдкрд╛рджрди рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдпрд╣ рдХрд╕реНрдЯрдо рдирд┐рд╖реНрдкрд╛рджрди рд╣реАред

рдХреНрдпреЛрдВ рдЦреБрдж рд╕реЗ? рдХреНрдпреЛрдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдЕрднреА рддрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИред рдФрд░ рдпреЗ рд╕рднреА рдЗрдХрд╛рдЗрдпрд╛рдБ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреАрдВ рдХрд┐ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рддрд╛рдХрд┐ рд╕рдВрдХрд▓рдХ рд╢рдкрде рди рд▓реЗ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ, рд╣рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд▓рдЧрднрдЧ рдХреЛрдИ рднреА рдЖрдИрдбреАрдИ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ - рдФрд░ рдЖрд╡реЗрджрди рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рднрд░ рдЬрд╛рддрд╛ рд╣реИред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИрдВ:

рдкрд░реАрдХреНрд╖рдг
 @RunWith(SpringRunner.class) @WebMvcTest @AutoConfigureMockMvc public class ControllerTest { @InjectMocks private Controller controller; @MockBean private UpdateProcessorService updateProcessorService; @Autowired private MockMvc mvc; @Test public void returnBadRequestOnDisableWithInvalidProductId() throws Exception { mvc.perform( post("/disableProduct?productId=-443") ).andDo( print() ).andExpect( status().isBadRequest() ).andExpect( content().json(getInvalidProductIdJsonContent()) ); } @Test public void returnBadRequestOnNotifyWithInvalidProductId() throws Exception { performUpdate( //language=JSON "{\n" + " \"productId\": -1,\n" + " \"color\": \"red\",\n" + " \"productQuantity\": 0\n" + "}" ).andDo( print() ).andExpect( status().isBadRequest() ).andExpect( content().json(getInvalidProductIdJsonContent()) ); } @Test public void returnBadRequestOnNotifyWithNegativeProductQuantity() throws Exception { performUpdate( //language=JSON "{\n" + " \"productId\": 1,\n" + " \"color\": \"red\",\n" + " \"productQuantity\": -10\n" + "}" ).andDo( print() ).andExpect( status().isBadRequest() ).andExpect( content().json("{\n" + " \"errors\": [\n" + " {\n" + " \"message\": \"productQuantity is invalid\"\n" + " }\n" + " ]\n" + "}") ); } @Test public void returnServerErrorOnDostavchenkoCommunicationError() throws Exception { doThrow(new DostavchenkoException()).when(updateProcessorService).processUpdate(any(Update.class)); performUpdate( //language=JSON "{\n" + " \"productId\": 1,\n" + " \"color\": \"red\",\n" + " \"productQuantity\": 10\n" + "}" ).andDo( print() ).andExpect( status().isInternalServerError() ).andExpect( content().json("{\n" + " \"errors\": [\n" + " {\n" + " \"message\": \"DostavchenKO communication exception\"\n" + " }\n" + " ]\n" + "}") ); } @Test public void returnServerErrorOnDataCommunicationError() throws Exception { doThrow(new DataCommunicationException()).when(updateProcessorService).processUpdate(any(Update.class)); performUpdate( //language=JSON "{\n" + " \"productId\": 1,\n" + " \"color\": \"red\",\n" + " \"productQuantity\": 10\n" + "}" ).andDo( print() ).andExpect( status().isInternalServerError() ).andExpect( content().json("{\n" + " \"errors\": [\n" + " {\n" + " \"message\": \"Can't communicate with Data system\"\n" + " }\n" + " ]\n" + "}") ); } @Test public void return200OnSuccess() throws Exception { performUpdate( //language=JSON "{\n" + " \"productId\": 1,\n" + " \"color\": \"red\",\n" + " \"productQuantity\": 10\n" + "}" ).andDo( print() ).andExpect( status().isOk() ); } @Test public void returnServerErrorOnUnexpectedException() throws Exception { doThrow(new RuntimeException()).when(updateProcessorService).processUpdate(any(Update.class)); performUpdate( //language=JSON "{\n" + " \"productId\": 1,\n" + " \"color\": \"red\",\n" + " \"productQuantity\": 10\n" + "}" ).andDo( print() ).andExpect( status().isInternalServerError() ).andExpect( content().json("{\n" + " \"errors\": [\n" + " {\n" + " \"message\": \"Internal Server Error\"\n" + " }\n" + " ]\n" + "}") ); } @Test public void returnTwoErrorMessagesOnInvalidProductIdAndNegativeQuantity() throws Exception { performUpdate( //language=JSON "{\n" + " \"productId\": -1,\n" + " \"color\": \"red\",\n" + " \"productQuantity\": -10\n" + "}" ).andDo( print() ).andExpect( status().isBadRequest() ).andExpect( content().json("{\n" + " \"errors\": [\n" + " { \"message\": \"productQuantity is invalid\" },\n" + " { \"message\": \"productId is invalid\" }\n" + " ]\n" + "}") ); } private ResultActions performUpdate(String jsonContent) throws Exception { return mvc.perform( post("/product-quantity-update") .contentType(MediaType.APPLICATION_JSON_UTF8_VALUE) .content(jsonContent) ); } private String getInvalidProductIdJsonContent() { return //language=JSON "{\n" + " \"errors\": [\n" + " {\n" + " \"message\": \"productId is invalid\"\n" + " }\n" + " ]\n" + "}"; } } 

рдЕрдм рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд╛рд╕ рд╣реЛрдВ:
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 @RestController @AllArgsConstructor @Validated @Slf4j public class Controller { private final UpdateProcessorService updateProcessorService; @PostMapping("/product-quantity-update") public void updateQuantity(@RequestBody @Valid Update update) { updateProcessorService.processUpdate(update); } @PostMapping("/disableProduct") public void disableProduct(@RequestParam("productId") @Min(0) Long productId) { updateProcessorService.disableProduct(Long.valueOf(productId)); } } 


рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд░
 @ControllerAdvice @Slf4j public class ApplicationExceptionHandler { @ExceptionHandler(ConstraintViolationException.class) @ResponseBody @ResponseStatus(HttpStatus.BAD_REQUEST) public ErrorResponse onConstraintViolationException(ConstraintViolationException exception) { log.info("Constraint Violation", exception); return new ErrorResponse(exception.getConstraintViolations().stream() .map(constraintViolation -> new ErrorResponse.Message( ((PathImpl) constraintViolation.getPropertyPath()).getLeafNode().toString() + " is invalid")) .collect(Collectors.toList())); } @ExceptionHandler(value = MethodArgumentNotValidException.class) @ResponseBody @ResponseStatus(value = HttpStatus.BAD_REQUEST) public ErrorResponse onMethodArgumentNotValidException(MethodArgumentNotValidException exception) { log.info(exception.getMessage()); List<ErrorResponse.Message> fieldErrors = exception.getBindingResult().getFieldErrors().stream() .map(fieldError -> new ErrorResponse.Message(fieldError.getField() + " is invalid")) .collect(Collectors.toList()); return new ErrorResponse(fieldErrors); } @ExceptionHandler(DostavchenkoException.class) @ResponseBody @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public ErrorResponse onDostavchenkoCommunicationException(DostavchenkoException exception) { log.error("DostavchenKO communication exception", exception); return new ErrorResponse(Collections.singletonList( new ErrorResponse.Message("DostavchenKO communication exception"))); } @ExceptionHandler(DataCommunicationException.class) @ResponseBody @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public ErrorResponse onDataCommunicationException(DataCommunicationException exception) { log.error("DostavchenKO communication exception", exception); return new ErrorResponse(Collections.singletonList( new ErrorResponse.Message("Can't communicate with Data system"))); } @ExceptionHandler(Exception.class) @ResponseBody @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public ErrorResponse onException(Exception exception) { log.error("Error while processing", exception); return new ErrorResponse(Collections.singletonList( new ErrorResponse.Message(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase()))); } } 


рдмрд╕ рдХреНрдпрд╛ рд╣реБрдЖ?


TDD рдореЗрдВ, рдЖрдкрдХреЛ рд╕рднреА рдХреЛрдб рдЕрдкрдиреЗ рд╕рд┐рд░ рдореЗрдВ рдирд╣реАрдВ рд░рдЦрдиреЗ рд╣реЛрдВрдЧреЗред

рдЪрд▓реЛ рдлрд┐рд░ рд╕реЗ: рд░реИрдо рдореЗрдВ рдкреВрд░реЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рди рд░рдЦреЗрдВред рд╕рд┐рд░реНрдл рдПрдХ рдкрд░рдд рдХреЛ рджреЗрдЦреЛред рд╡рд╣ рд╕рд░рд▓ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдорд╕реНрддрд┐рд╖реНрдХ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рдпрджрд┐ рдЖрдк рдПрдХ рдорд╣рд╛рдирд╛рдпрдХ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд╕рд┐рд░ рдореЗрдВ рдПрдХ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рднреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЯреАрдбреАрдбреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреИрд╕реЗ рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ, рдЙрддрдиреА рд╣реА рдмрдбрд╝реА рдЧрд▓рддреАред

рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЕрдЧрд▓реА рдкрд░рдд рдХреА рдХреНрдпрд╛ рдЬрд░реВрд░рдд рд╣реИ, рдЬреАрд╡рди рдореЗрдВ рдЬреНрдЮрд╛рди рдЖрддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЪреАрдЬреЛрдВ рдХреЛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЖрдк рдПрдХ рд▓рдбрд╝рдХреА рдХреЗ рд╕рд╛рде рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╡рд╣ рдХрд╛рдо рдкрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд╣рддреА рд╣реИред рдФрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рд╣реИ, рдЖрдк рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдХреЛ рд░реИрдХ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЙрд╕реЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЙрд╕реЗ рд╕рд┐рд░реНрдл рдмрддрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдФрд░ рд╡рд╣ рдпрд╣ рд╣реИред рд╡рд╣ рд╕рд┐рд░реНрдл рдХреБрдЫ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреА рдереАред рд╕реБрдирдиреЗ рдХреЗ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрдирд╛ рдЕрдирдореЛрд▓ рд╣реИред рдмрд╛рдХреА рд╕рдм рдХреЗ рд▓рд┐рдП ... рдЕрдЪреНрдЫрд╛, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВред


рд╕реЗрд╡рд╛


рдЕрдЧрд▓рд╛ рд╣рдо рд╕реЗрд╡рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдо рд╕реЗрд╡рд╛ рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рд╡реНрдпрд╛рдкрд╛рд░рд┐рдХ рддрд░реНрдХ рд╕реЗ рдирд┐рдкрдЯреЗ, рдпрд╛рдиреА:

  1. рд╡рд╣ рдЬрд╛рдирддрд╛ рдерд╛ рдХрд┐ рдорд╛рд▓ рдХреИрд╕реЗ рдХрд╛рдЯрдирд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП :
  2. рдЙрдкрд▓рдмреНрдзрддрд╛, рдпрджрд┐ рдЙрддреНрдкрд╛рдж рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕реНрдЯреЙрдХ рдореЗрдВ рд╣реИ, рддреЛ рдЙрддреНрдкрд╛рдж рдХрд╛ рд░рдВрдЧ рдкреАрд▓рд╛ рд╣реИ, рдФрд░ DostavchenKO рдбрд┐рд▓реАрд╡рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред
  3. рджреБрд░реНрдЧрдорддрд╛, рдЕрдЧрд░ рд╕рд╛рдорд╛рди рдХрд┐рд╕реА рдЪреАрдЬ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред
  4. рдпрджрд┐ рдЙрддреНрдкрд╛рдж рдиреАрд▓рд╛ рд╣реИ, рддреЛ рджреБрд░реНрдЧрдорддрд╛ред
  5. рджреБрд░реНрдЧрдорддрд╛ рдЕрдЧрд░ DostavchenKO рдЗрд╕реЗ рд▓реЗ рдЬрд╛рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддреА рд╣реИред
  6. рдпрджрд┐ рдорд╛рд▓ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рджреБрд░реНрдЧрдорддрд╛ред
  7. рдЕрдЧрд▓рд╛, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рд╕рд┐рд╕реНрдЯрдо рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИ рддреЛ рд╕реЗрд╡рд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдлреЗрдВрдХ рджреЗред
  8. рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, DATA рдХреЛ рд╕реНрдкреИрдо рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрд▓рд╕реА рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН:
  9. рдпрджрд┐ рд╣рдо рдорд╛рд▓ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдорд╛рд▓ рднреЗрдЬрддреЗ рдереЗ рдФрд░ рдЕрдм рд╣рдордиреЗ рдЧрдгрдирд╛ рдХреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рд╣рдо рдХреБрдЫ рднреА рдирд╣реАрдВ рднреЗрдЬрддреЗ рд╣реИрдВред
  10. рдФрд░ рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдЙрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рднреЗрдЬрддреЗ рд╣реИрдВред
  11. рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрд╣реАрдВ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ...

рдмрдВрдж рдХрд░реЛ!


рдХреНрдпрд╛ рдЖрдкрдХреЛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд░рдиреЗ рд▓рдЧреА рд╣реИ?

рд╣рдорд╛рд░реА рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП, рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рди рдХреЛ рдХреИрд╕реЗ рдмрдВрдж рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдкрд╣реБрдВрдЪ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдкрд╣рд▓реЗ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рднреЗрдЬрддрд╛ рд╣реИред рдпрд╣ рдЙрдЪреНрдЪ рд╕рд╛рдордВрдЬрд╕реНрдп рдирд╣реАрдВ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рд╖рдо рдХрд╛рд░реНрдпрд╛рддреНрдордХрддрд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреАрди рд╕реЗрд╡рд╛рдПрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП: рдПрдХ рд╕рд╛рдорд╛рди рдХреЗ рд╡рд┐рдпреЛрдЧ рд╕реЗ рдирд┐рдкрдЯреЗрдЧрд╛, рджреВрд╕рд░рд╛ рд╡рд┐рддрд░рдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕реЗрд╡рд╛ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ рдЬреЛ рдпрд╣ рддрдп рдХрд░реЗрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рднреЗрдЬрдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╡реИрд╕реЗ, рдЗрд╕ рддрд░рд╣ рд╕реЗ, рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рд╕реЗрд╡рд╛ рдХреЛ DATA рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд▓рд╕ рднреА рд╣реИред

рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рдЕрдХреНрд╕рд░, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реБрд░реНрдЦрд┐рдпреЛрдВ рдореЗрдВ рдЖрдиреЗ рдХреЗ рдмрд╛рдж, рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рдХреНрд╖рдгреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдпрджрд┐ рд╣рдордиреЗ рддреБрд░рдВрдд рд╕реЗрд╡рд╛ рд▓рд┐рдЦреА, рддреЛ рдпрд╣ рд╕реЛрдЪреЗ рдмрд┐рдирд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдЕрддрд┐рд╡реНрдпрд╛рдкреА рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрдврд╝ рдЬрд╛рдПрдЧреАред рдореИрдВ рдЕрдкрдиреА рдУрд░ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд╡рд╣ рдЙрджрд╛рд╣рд░рдг рдерд╛ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдореЗрд░реЗ рд╕рд╛рде рд╣реБрдЖ рдФрд░ рдЯреАрдбреАрдбреА рдФрд░ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмреАрдЪ рдЧреБрдгрд╛рддреНрдордХ рдЕрдВрддрд░ рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред

рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ


рдЙрдЪреНрдЪ рд╕рд╛рдордВрдЬрд╕реНрдп рдХреЗ рд╕рдорд╛рди рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд╕реЗрд╡рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реБрдП, рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ DostavchenKO рдХреЗ рдмреАрдЪ рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рдПрдХ рдФрд░ рд╕реНрддрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░, рдЪреВрдВрдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗрд╡рд╛ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо DostavchenKO рдЧреНрд░рд╛рд╣рдХ рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдЕрдиреБрдмрдВрдз рдХреА рдорд╛рдВрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╣рдо рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдЧреНрд░рд╛рд╣рдХ рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

 public boolean isAvailableForTransportation(Long productId) {...} 

рд╕реЗрд╡рд╛ рд╕реНрддрд░ рдкрд░, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреЛрдИ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ DostavchenKO рдХреИрд╕реЗ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ: рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓ рдЬрд╛рдПрдЧреАред рдПрдХ рдмрд╛рд░ рдпрд╣ рд╕рд░рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рдХрдИ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛: рдлрд┐рд▓рд╣рд╛рд▓ рд╣рдо рдЗрд╕рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВред

рд╣рдо рдПрдХ рдРрд╕реА рд╕реЗрд╡рд╛ рд╕реЗ рдПрдХ рд╕рдорд╛рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рдорд╛рд▓ рд╕реЗ рдирд┐рдкрдЯреЗрдЧрд╛:

 public boolean isProductEnabled(Long productId) {...} 

рдЗрд╕рд▓рд┐рдП, рдкреНрд░рд╢реНрди "рдореБрдЭреЗ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рд╕реЗрд╡рд╛ рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?"

рд╕реЗрд╡рд╛ рдЯреЗрд╕реНрдЯ
 @RunWith(MockitoJUnitRunner.class) public class UpdateProcessorServiceTest { @InjectMocks private UpdateProcessorService updateProcessorService; @Mock private ManualExclusionService manualExclusionService; @Mock private DostavchenkoClient dostavchenkoClient; @Mock private AvailabilityNotifier availabilityNotifier; @Test public void notifyAvailableIfYellowProductIsEnabledAndReadyForTransportation() { final Update testProduct = new Update(1L, 10L, "Yellow"); when(dostavchenkoClient.isAvailableForTransportation(testProduct.getProductId())).thenReturn(true); when(manualExclusionService.isProductEnabled(testProduct.getProductId())).thenReturn(true); updateProcessorService.processUpdate(testProduct); verify(availabilityNotifier, only()).notify(eq(new ProductAvailability(testProduct.getProductId(), true))); } @Test public void notifyNotAvailableIfProductIsAbsent() { final Update testProduct = new Update(1L, 0L, "Yellow"); updateProcessorService.processUpdate(testProduct); verify(availabilityNotifier, only()).notify(eq(new ProductAvailability(testProduct.getProductId(), false))); verifyNoMoreInteractions(manualExclusionService); verifyNoMoreInteractions(dostavchenkoClient); } @Test public void notifyNotAvailableIfProductIsBlue() { final Update testProduct = new Update(1L, 10L, "Blue"); updateProcessorService.processUpdate(testProduct); verify(availabilityNotifier, only()).notify(eq(new ProductAvailability(testProduct.getProductId(), false))); verifyNoMoreInteractions(manualExclusionService); verifyNoMoreInteractions(dostavchenkoClient); } @Test public void notifyNotAvailableIfProductIsDisabled() { final Update testProduct = new Update(1L, 10L, "Yellow"); when(manualExclusionService.isProductEnabled(testProduct.getProductId())).thenReturn(false); updateProcessorService.processUpdate(testProduct); verify(availabilityNotifier, only()).notify(eq(new ProductAvailability(testProduct.getProductId(), false))); verifyNoMoreInteractions(dostavchenkoClient); } @Test public void notifyNotAvailableIfProductIsNotReadyForTransportation() { final Update testProduct = new Update(1L, 10L, "Yellow"); when(dostavchenkoClient.isAvailableForTransportation(testProduct.getProductId())).thenReturn(false); when(manualExclusionService.isProductEnabled(testProduct.getProductId())).thenReturn(true); updateProcessorService.processUpdate(testProduct); verify(availabilityNotifier, only()).notify(eq(new ProductAvailability(testProduct.getProductId(), false))); } @Test(expected = DostavchenkoException.class) public void throwCustomExceptionIfDostavchenkoCommunicationFailed() { final Update testProduct = new Update(1L, 10L, "Yellow"); when(dostavchenkoClient.isAvailableForTransportation(testProduct.getProductId())) .thenThrow(new RestClientException("Something's wrong")); when(manualExclusionService.isProductEnabled(testProduct.getProductId())).thenReturn(true); updateProcessorService.processUpdate(testProduct); } } 


рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╡реЗ рдЦреБрдж рд╕реЗ рдкреИрджрд╛ рд╣реБрдП рдереЗ:

  • DostavchenKO рдЧреНрд░рд╛рд╣рдХ рд╕реЗрд╡рд╛-рдЕрдиреБрдХреВрд▓ рд╕рд┐рдВрдЧреБрд░рд╛ рдХреЗ рд╕рд╛рде
  • рдПрдХ рд╕реЗрд╡рд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрд▓рд╕реА рднреЗрдЬрдиреЗ рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХреА рдЧрдИ рд╕реЗрд╡рд╛ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░реЗрдЧреА
  • рдХрд╛рдЯреЗ рдЧрдП рдорд╛рд▓ рдФрд░ рдЙрд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рд╕реЗрд╡рд╛

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 @RequiredArgsConstructor @Service @Slf4j public class UpdateProcessorService { private final AvailabilityNotifier availabilityNotifier; private final DostavchenkoClient dostavchenkoClient; private final ManualExclusionService manualExclusionService; public void processUpdate(Update update) { if (update.getProductQuantity() <= 0) { availabilityNotifier.notify(getNotAvailableProduct(update.getProductId())); return; } if ("Blue".equals(update.getColor())) { availabilityNotifier.notify(getNotAvailableProduct(update.getProductId())); return; } if (!manualExclusionService.isProductEnabled(update.getProductId())) { availabilityNotifier.notify(getNotAvailableProduct(update.getProductId())); return; } try { final boolean availableForTransportation = dostavchenkoClient.isAvailableForTransportation(update.getProductId()); availabilityNotifier.notify(new ProductAvailability(update.getProductId(), availableForTransportation)); } catch (Exception exception) { log.warn("Problems communicating with DostavchenKO", exception); throw new DostavchenkoException(); } } private ProductAvailability getNotAvailableProduct(Long productId) { return new ProductAvailability(productId, false); } } 


рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдирд╛


рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рдЯреАрдбреАрдбреА рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ - рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧред рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рдж, рд╕реЗрд╡рд╛ рдЕрдиреБрдмрдВрдз рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛:

 public void disableProduct(long productId) 

рдФрд░ рдЕрдм рд╣рдордиреЗ рд╡рд┐рдпреЛрдЧ рддрд░реНрдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕реЗрд╡рд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдЗрд╕ рд╕реЗрд╡рд╛ рд╕реЗ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

  • рдорд╛рд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
  • рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рд╡рд╣ рдкрд╣рд▓реЗ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддреЛ рдорд╛рд▓ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  • рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рд╡рд╛рдкрд╕ рд▓реМрдЯ рдЖрдП, рдЕрдЧрд░ рд╕рд╛рдорд╛рди рдкрд╣рд▓реЗ рд╕реЗ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдерд╛ред

рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЬреЛ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рд╕реЗрд╡рд╛ рдФрд░ рдЕрдиреБрдорд╛рдирд┐рдд рдПрдХ рдХреЗ рдмреАрдЪ рдЕрдиреБрдмрдВрдз рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:

  1. рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк рддреБрд░рдВрдд рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрд╡реЗрджрди рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрджрд┐ рдХреЛрдИ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рдЙрддреНрдкрд╛рдж рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлрд┐рд▓рд╣рд╛рд▓ рдпрд╣ рд╕реЗрд╡рд╛ рдмрд╕ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреА рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЯреАрдУрдЖрд░ рдХреЗ рдкрд╣рд▓реЗ рдкрдврд╝рдиреЗ рдХреЗ рдареАрдХ рдмрд╛рдж рдпрд╣ рд╕рд╡рд╛рд▓ рдЙрдардирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛, рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рдкреНрд░рдгрд╛рд▓реА рддреИрдпрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдпрд╣ рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдереЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЗрдХрд╛рдИ рд╣реЛрдЧреА рдЬреЛ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреЛрдВ рдХреА рдХрдЯрд╛рдИ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ: рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкреИрджрд╛ рд╣реБрдП рдереЗред
  2. -, . тАФ , . , , , , , , . . ProductAvailability. , . . ., , god object, , , , TDD, , . , , ┬л┬╗ тАФ : ┬л ...┬╗ , , TDD, .

:

 @SpringBootTest @RunWith(SpringRunner.class) public class ManualExclusionServiceTest { @Autowired private ManualExclusionService service; @Autowired private ManualExclusionRepository manualExclusionRepository; @Before public void clearDb() { manualExclusionRepository.deleteAll(); } @Test public void disableItem() { Long productId = 100L; service.disableProduct(productId); assertThat(service.isProductEnabled(productId), is(false)); } @Test public void returnEnabledIfProductWasNotDisabled() { assertThat(service.isProductEnabled(100L), is(true)); assertThat(service.isProductEnabled(200L), is(true)); } } 


 @Service @AllArgsConstructor public class ManualExclusionService { private final ManualExclusionRepository manualExclusionRepository; public boolean isProductEnabled(Long productId) { return !manualExclusionRepository.exists(productId); } public void disableProduct(long productId) { manualExclusionRepository.save(new ManualExclusion(productId)); } } 



, , , DATA .

, -, . . ProductAvailability, : productId isAvailable.

, :

  • .
  • , .
  • , .
  • , , , .
  • рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм DATA рдХреА рдУрд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реЗрд╡рд╛ рдХреЛ рдЕрдкрдиреЗ DataCommunicationException рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:

рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рднреЗрдЬрд╛ рдерд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рднрдВрдбрд╛рд░ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕рд╛рдорд╛рди рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдкрд░ рдкрд┐рдЫрд▓реЗ рдЧрдгрдирд╛ рдХреЛ рдмрдЪрд╛рдПрдВрдЧреЗред

ProductAvucation рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХреЛрдИ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЛ рдмрдирд╛рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ @Document (рд╣рдо рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ MongoDb рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ) рдФрд░ ProductAvucation рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рде рдирд╣реАрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗред

рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рд╕рднреА рдХреБрдЫ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде ProductAvucation рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рдЬрд╛рдЗрдирд┐рдВрдЧ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЪрд░рдг рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдо рдбрд┐рдЬрд╛рдЗрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЙрд▓ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИрдВред рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рдереАред

рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдмрд╛рдд рд╣реИред

рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА ProductAvucation рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд▓рд┐рдЦ тАЛтАЛрджрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрднреА рд╕реЗрд╡рд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдирдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛ рдХрд┐ рдЗрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рднрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдХрдо рд▓реЛрдЧ рд╣реЛрдВрдЧреЗ рдЬреЛ рдкреНрд░реЛрдбрдХреНрдЯ рдПрд╡рд┐рдПрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдХрд┐рд╕реА рджреЗрд╡ рд╡рд╕реНрддреБ рдХреЛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрджрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рддреБрд░рдВрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрд╛: рддреЛ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдПрдХ рдореМрдЬреВрджрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдЕрдиреНрдп рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

рдкрд░реАрдХреНрд╖рдг
 @RunWith(SpringRunner.class) @SpringBootTest public class LazyAvailabilityNotifierTest { @Autowired private LazyAvailabilityNotifier lazyAvailabilityNotifier; @MockBean @Qualifier("dataClient") private AvailabilityNotifier availabilityNotifier; @Autowired private AvailabilityRepository availabilityRepository; @Before public void clearDb() { availabilityRepository.deleteAll(); } @Test public void notifyIfFirstTime() { sendNotificationAndVerifyDataBase(new ProductAvailability(1L, false)); } @Test public void notifyIfAvailabilityChanged() { final ProductAvailability oldProductAvailability = new ProductAvailability(1L, false); sendNotificationAndVerifyDataBase(oldProductAvailability); final ProductAvailability newProductAvailability = new ProductAvailability(1L, true); sendNotificationAndVerifyDataBase(newProductAvailability); } @Test public void doNotNotifyIfAvailabilityDoesNotChanged() { final ProductAvailability productAvailability = new ProductAvailability(1L, false); sendNotificationAndVerifyDataBase(productAvailability); sendNotificationAndVerifyDataBase(productAvailability); sendNotificationAndVerifyDataBase(productAvailability); sendNotificationAndVerifyDataBase(productAvailability); verify(availabilityNotifier, only()).notify(eq(productAvailability)); } @Test public void doNotSaveIfSentWithException() { doThrow(new RuntimeException()).when(availabilityNotifier).notify(anyObject()); boolean exceptionThrown = false; try { availabilityNotifier.notify(new ProductAvailability(1L, false)); } catch (RuntimeException exception) { exceptionThrown = true; } assertTrue("Exception was not thrown", exceptionThrown); assertThat(availabilityRepository.findAll(), hasSize(0)); } @Test(expected = DataCommunicationException.class) public void wrapDataException() { doThrow(new RestClientException("Something wrong")).when(availabilityNotifier).notify(anyObject()); lazyAvailabilityNotifier.notify(new ProductAvailability(1L, false)); } private void sendNotificationAndVerifyDataBase(ProductAvailability productAvailability) { lazyAvailabilityNotifier.notify(productAvailability); verify(availabilityNotifier).notify(eq(productAvailability)); assertThat(availabilityRepository.findAll(), hasSize(1)); assertThat(availabilityRepository.findAll().get(0), hasProperty("productId", is(productAvailability.getProductId()))); assertThat(availabilityRepository.findAll().get(0), hasProperty("availability", is(productAvailability.isAvailable()))); } } 


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 @Component @AllArgsConstructor @Slf4j public class LazyAvailabilityNotifier implements AvailabilityNotifier { private final AvailabilityRepository availabilityRepository; private final AvailabilityNotifier availabilityNotifier; @Override public void notify(ProductAvailability productAvailability) { final AvailabilityPersistenceObject persistedProductAvailability = availabilityRepository .findByProductId(productAvailability.getProductId()); if (persistedProductAvailability == null) { notifyWith(productAvailability); availabilityRepository.save(createObjectFromProductAvailability(productAvailability)); } else if (persistedProductAvailability.isAvailability() != productAvailability.isAvailable()) { notifyWith(productAvailability); persistedProductAvailability.setAvailability(productAvailability.isAvailable()); availabilityRepository.save(persistedProductAvailability); } } private void notifyWith(ProductAvailability productAvailability) { try { availabilityNotifier.notify(productAvailability); } catch (RestClientException exception) { log.error("Couldn't notify", exception); throw new DataCommunicationException(); } } private AvailabilityPersistenceObject createObjectFromProductAvailability(ProductAvailability productAvailability) { return new AvailabilityPersistenceObject(productAvailability.getProductId(), productAvailability.isAvailable()); } } 


рдирд┐рд╖реНрдХрд░реНрд╖



рдПрдХ рд╕рдорд╛рди рдЖрд╡реЗрджрди рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдерд╛ред рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдпрд╣ рдЯреАрдбреАрдбреА рдХреЗ рдмрд┐рдирд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдлрд┐рд░ рд╡реНрдпрд╡рд╕рд╛рдп рдиреЗ рдХрд╣рд╛ рдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рдерд╛, рдФрд░ рдЫрд╣ рдорд╣реАрдиреЗ рдХреЗ рдмрд╛рдж рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдЖрдпрд╛, рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦрд░реЛрдВрдЪ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ (рд▓рд╛рдн рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╕реНрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╣реИ, рдФрд░ рдпрд╣ рдХреБрдЫ рдмрд╛рд╣рд░ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рдерд╛) ред

рд╡рд┐рднрд┐рдиреНрди рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдХрд░, рдореИрдВ рдЙрдирдХреЗ рдорддрднреЗрджреЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЕрдкрдиреЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЯреАрдбреАрдбреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рдХреИрд╕реЗ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЕрдзрд┐рдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗред

рдореИрдВ рдпрд╣ рдорд╛рди рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐, рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкрд╣рд▓реЗ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдмрдирд╛рдпрд╛ рд╡рд░реНрдЧ рдХреНрдпрд╛ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдХреЛрдИ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдСрдмреНрдЬреЗрдХреНрдЯ" рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдЯреАрдХ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╡рд╕реНрддреБ рдЙрдиреНрд╣реЗрдВ рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рд▓реЛрднрди рдХреЗ рдЬрд▓реНрджреА рд╕реЗ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдПрдХ рдЗрдХрд╛рдИ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯреЗрдЧреАред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдкрдиреЗ рд▓рд┐рдП рдЯреАрдбреАрдбреА рдХреЗ рдореБрдЦреНрдп рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдореИрдВ рдЗрд╕ рдмрд╛рдд рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдЙрддреНрдкрд╛рдж рдкрд░ рдЕрдзрд┐рдХ рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛ рдЧрдпрд╛ рд╣реВрдВ рдЬреЛ рдореИрдВ рдЙрддреНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ TDD рдкрд░ рд▓рд┐рдЦреЗ рдЧрдП рдФрд╕рдд рдХреЛрдб рдХреЛ рд╢рд╛рдпрдж рдкрд░реАрдХреНрд╖рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореИрдВрдиреЗ TDD рдкрд░ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рдореЗрд░реЗ рджрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХреЛрдб рдХреЗ рдореЗрд░реЗ рд╕рдВрдкрд╛рджрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рд╣реЛ рдЧрдИ рдереА рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд▓рдЧрднрдЧ рд╢реВрдиреНрдп рд╣реИред

рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рднрд╛рд╡рдирд╛ рдереА рдХрд┐ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдмреЗрд╣рддрд░ рдмрди рдЧрдпрд╛ред

рдЖрд╡реЗрджрди рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореИрдВ рдХрдорд┐рдЯреНрд╕ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ TDD рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрдПрдЧреАред

рдпрд╣рд╛рдБ рдПрдХ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИрдПрдХ рд╡реАрдбрд┐рдпреЛ рдЬреЛ рдореИрдВ рдЕрддреНрдпрдзрд┐рдХ рдХрд┐рд╕реА рдХреЛ рджреЗрдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдЬреЛ рдЯреАрдбреАрдбреА рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЙрддрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдЬреНрд╕рди рдХреА рддрд░рд╣ рдПрдХ рд╕реНрд╡рд░реВрдкрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЖрд╡реЗрджрди POJO рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдкрд░ json рдХреЛ рдкрд╛рд░реНрд╕ рдХреИрд╕реЗ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдк IDEA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЬрд▓реНрджреА рдФрд░ рдмрд┐рдирд╛ рджрд░реНрдж рдХреЗ JSON рднрд╛рд╖рд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡рд╢реНрдпрдХ рд╕реНрд╡рд░реВрдкрдг рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдиреБрдХрд╕рд╛рди рдХреНрдпрд╛ рд╣реИрдВ?


рдпрд╣ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдВрдмрд╛ рд╕рдордп рд╣реИред рдорд╛рдирдХ рдкреНрд░рддрд┐рдорд╛рди рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рдирд╛, рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА рдХреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдХреЛрдВ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕реЗрд╡рд╛ рджреЗрдиреЗ рдХрд╛ рдЦрд░реНрдЪ рд╡рд╣рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рддреЗрдЬ рдерд╛ред рдЯреАрдбреАрдбреА рдкрд░ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдордп рд╕реАрдорд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рдкреНрд░рдмрдВрдзрдХ рдирд╛рдЦреБрд╢ рд╣реЛрдВрдЧреЗред рдпрд╣рд╛рдБ, рд╡реНрдпрд╛рдкрд╛рд░ рджреВрд░ рд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ, рд▓реЗрдХрд┐рди рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдФрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рддреЗрдЬреА рд╕реЗред рдореИрдВ рдЕрдкрдиреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдЪреБрдирддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рджреВрд╕рд░рд╛ рдкрд░рд┐рдгрд╛рдо рд▓рдВрдмрд╛ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдмрдбрд╝реА рдирд╕реЛрдВ рдХреЗ рд╕рд╛рдеред

рдореЗрд░реА рднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, TDD рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдмрдирд╛рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреНрд▓рд╛рд╕ рдЯреЗрд╕реНрдЯ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдВред

рдЯреАрдбреАрдбреА рдЪрд╛рдВрджреА рдХреА рдЧреЛрд▓реА рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ, рдкрдардиреАрдп рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдХрд╣рд╛рдиреА рд╣реИ рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдиреЗ рдПрди рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдИрдВ, рдЬреЛ рдХрд┐ рдлрд╛рдЙрд▓рд░ рдХреА рддрд░рд╣ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреА-рдЕрдкрдиреА рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдлрд┐рд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдЖрдзрд╛рд░ рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрди рдХреНрд╡реЗрд░реА рд╣реЛрдЧреАред рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1 рджреЗрд╡ рд╡рд╕реНрддреБ рдФрд░ 1 рдмрд╛рд░ рдЬрд╛рдирд╛ред рдпрджрд┐ рдЖрдк рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рд▓рдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЯреАрдбреАрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдкрдХреЛ рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛: рдкрдардиреАрдп рдХреЛрдб рд╣рдореЗрд╢рд╛ рд╕рдмрд╕реЗ рддреЗрдЬ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЗрд╕ рдкрджреНрдзрддрд┐ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ - рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рджрд░реНрдж рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдореИрдВрдиреЗ 1.5 рджрд┐рди рд▓рд┐рдЦрд╛ рдерд╛ред

рдЦреИрд░, рдЖрдЦрд┐рд░реАред рдпрджрд┐ рдЖрдк TDD рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХрд╛ рдХреЛрдб рдЕрднреА рднреА рдмрд╣реБрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдорд╛рдорд▓рд╛ рдХрд╛рд░реНрдпрдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдорджрдж рдорд┐рд▓реАред

Source: https://habr.com/ru/post/hi456662/


All Articles