рдХреНрдпрд╛ рдЖрдкрдХреА рдХрднреА рдпрд╣ рд╣рд╛рд▓рдд рд╣реБрдИ рд╣реИ?
рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 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(
рдмрд╕ рдХреНрдпрд╛ рд╣реБрдЖ?
рд╣рдордиреЗ рдПрдХ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдорд╛рд░реНрдЧ рд╣рдореЗрдВ рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕рдВрдЪрд╛рд▓рди рдХреНрд╖рдорддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред рдФрд░ рд╣рдордиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдерд╛ рдЬрдм рд╣рдо рд╕реЗрд╡рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдлрд╛рдпрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рд▓реЗрдЦрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдореБрдЭреЗ
рд╡рд╛рд╕реНрддрд╡рд┐рдХ 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(
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдХрдИ рдЪреАрдЬреЗрдВ рдЕрдкрдиреЗ рдЖрдк рд╕рд╛рдордиреЗ рдЖрдИрдВ:
- рдПрдХ рд╕реЗрд╡рд╛ рдЬрд┐рд╕реЗ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЬрд┐рд╕реЗ рдПрдХ рдирдИ рдорд╛рддреНрд░рд╛ рдХреЗ рд╕рд╛рдорд╛рди рдХреЗ рд▓рд┐рдП рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рдПрдЧрд╛ред
- рдЗрд╕ рд╕реЗрд╡рд╛ рдХреА рд╡рд┐рдзрд┐, рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдЗрд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░, рдЬреЛ рдЗрд╕ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░реЗрдВрдЧреЗред
- рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдкрд░ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╕реНрдЯрдо рдирд┐рд╖реНрдкрд╛рджрди рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдпрд╣ рдХрд╕реНрдЯрдо рдирд┐рд╖реНрдкрд╛рджрди рд╣реАред
рдХреНрдпреЛрдВ рдЦреБрдж рд╕реЗ? рдХреНрдпреЛрдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдЕрднреА рддрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИред рдФрд░ рдпреЗ рд╕рднреА рдЗрдХрд╛рдЗрдпрд╛рдБ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреАрдВ рдХрд┐ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рддрд╛рдХрд┐ рд╕рдВрдХрд▓рдХ рд╢рдкрде рди рд▓реЗ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ, рд╣рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд▓рдЧрднрдЧ рдХреЛрдИ рднреА рдЖрдИрдбреАрдИ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ - рдФрд░ рдЖрд╡реЗрджрди рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рднрд░ рдЬрд╛рддрд╛ рд╣реИред
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИрдВ:
рдкрд░реАрдХреНрд╖рдг @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(
рдЕрдм рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд╛рд╕ рд╣реЛрдВ:
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди @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 рдореЗрдВ, рдЖрдкрдХреЛ рд╕рднреА рдХреЛрдб рдЕрдкрдиреЗ рд╕рд┐рд░ рдореЗрдВ рдирд╣реАрдВ рд░рдЦрдиреЗ рд╣реЛрдВрдЧреЗредрдЪрд▓реЛ рдлрд┐рд░ рд╕реЗ: рд░реИрдо рдореЗрдВ рдкреВрд░реЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рди рд░рдЦреЗрдВред рд╕рд┐рд░реНрдл рдПрдХ рдкрд░рдд рдХреЛ рджреЗрдЦреЛред рд╡рд╣ рд╕рд░рд▓ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдорд╕реНрддрд┐рд╖реНрдХ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рдпрджрд┐ рдЖрдк рдПрдХ рдорд╣рд╛рдирд╛рдпрдХ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд╕рд┐рд░ рдореЗрдВ рдПрдХ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рднреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЯреАрдбреАрдбреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреИрд╕реЗ рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ, рдЙрддрдиреА рд╣реА рдмрдбрд╝реА рдЧрд▓рддреАред
рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЕрдЧрд▓реА рдкрд░рдд рдХреА рдХреНрдпрд╛ рдЬрд░реВрд░рдд рд╣реИ, рдЬреАрд╡рди рдореЗрдВ рдЬреНрдЮрд╛рди рдЖрддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЪреАрдЬреЛрдВ рдХреЛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЖрдк рдПрдХ рд▓рдбрд╝рдХреА рдХреЗ рд╕рд╛рде рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╡рд╣ рдХрд╛рдо рдкрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд╣рддреА рд╣реИред рдФрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рд╣реИ, рдЖрдк рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдХреЛ рд░реИрдХ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЙрд╕реЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЙрд╕реЗ рд╕рд┐рд░реНрдл рдмрддрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдФрд░ рд╡рд╣ рдпрд╣ рд╣реИред рд╡рд╣ рд╕рд┐рд░реНрдл рдХреБрдЫ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреА рдереАред рд╕реБрдирдиреЗ рдХреЗ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрдирд╛ рдЕрдирдореЛрд▓ рд╣реИред рдмрд╛рдХреА рд╕рдм рдХреЗ рд▓рд┐рдП ... рдЕрдЪреНрдЫрд╛, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВред

рд╕реЗрд╡рд╛
рдЕрдЧрд▓рд╛ рд╣рдо рд╕реЗрд╡рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдо рд╕реЗрд╡рд╛ рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рд╡реНрдпрд╛рдкрд╛рд░рд┐рдХ рддрд░реНрдХ рд╕реЗ рдирд┐рдкрдЯреЗ, рдпрд╛рдиреА:
- рд╡рд╣ рдЬрд╛рдирддрд╛ рдерд╛ рдХрд┐ рдорд╛рд▓ рдХреИрд╕реЗ рдХрд╛рдЯрдирд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП :
- рдЙрдкрд▓рдмреНрдзрддрд╛, рдпрджрд┐ рдЙрддреНрдкрд╛рдж рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕реНрдЯреЙрдХ рдореЗрдВ рд╣реИ, рддреЛ рдЙрддреНрдкрд╛рдж рдХрд╛ рд░рдВрдЧ рдкреАрд▓рд╛ рд╣реИ, рдФрд░ DostavchenKO рдбрд┐рд▓реАрд╡рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред
- рджреБрд░реНрдЧрдорддрд╛, рдЕрдЧрд░ рд╕рд╛рдорд╛рди рдХрд┐рд╕реА рдЪреАрдЬ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред
- рдпрджрд┐ рдЙрддреНрдкрд╛рдж рдиреАрд▓рд╛ рд╣реИ, рддреЛ рджреБрд░реНрдЧрдорддрд╛ред
- рджреБрд░реНрдЧрдорддрд╛ рдЕрдЧрд░ DostavchenKO рдЗрд╕реЗ рд▓реЗ рдЬрд╛рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддреА рд╣реИред
- рдпрджрд┐ рдорд╛рд▓ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рджреБрд░реНрдЧрдорддрд╛ред
- рдЕрдЧрд▓рд╛, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рд╕рд┐рд╕реНрдЯрдо рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИ рддреЛ рд╕реЗрд╡рд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдлреЗрдВрдХ рджреЗред
- рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, DATA рдХреЛ рд╕реНрдкреИрдо рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрд▓рд╕реА рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН:
- рдпрджрд┐ рд╣рдо рдорд╛рд▓ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдорд╛рд▓ рднреЗрдЬрддреЗ рдереЗ рдФрд░ рдЕрдм рд╣рдордиреЗ рдЧрдгрдирд╛ рдХреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рд╣рдо рдХреБрдЫ рднреА рдирд╣реАрдВ рднреЗрдЬрддреЗ рд╣реИрдВред
- рдФрд░ рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдЙрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рднреЗрдЬрддреЗ рд╣реИрдВред
- рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрд╣реАрдВ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ...
рдмрдВрдж рдХрд░реЛ!рдХреНрдпрд╛ рдЖрдкрдХреЛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд░рдиреЗ рд▓рдЧреА рд╣реИ?
рд╣рдорд╛рд░реА рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП, рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рди рдХреЛ рдХреИрд╕реЗ рдмрдВрдж рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдкрд╣реБрдВрдЪ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдкрд╣рд▓реЗ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рднреЗрдЬрддрд╛ рд╣реИред рдпрд╣ рдЙрдЪреНрдЪ рд╕рд╛рдордВрдЬрд╕реНрдп рдирд╣реАрдВ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рд╖рдо рдХрд╛рд░реНрдпрд╛рддреНрдордХрддрд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреАрди рд╕реЗрд╡рд╛рдПрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП: рдПрдХ рд╕рд╛рдорд╛рди рдХреЗ рд╡рд┐рдпреЛрдЧ рд╕реЗ рдирд┐рдкрдЯреЗрдЧрд╛, рджреВрд╕рд░рд╛ рд╡рд┐рддрд░рдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕реЗрд╡рд╛ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ рдЬреЛ рдпрд╣ рддрдп рдХрд░реЗрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рднреЗрдЬрдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╡реИрд╕реЗ, рдЗрд╕ рддрд░рд╣ рд╕реЗ, рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рд╕реЗрд╡рд╛ рдХреЛ 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)
рдФрд░ рдЕрдм рд╣рдордиреЗ рд╡рд┐рдпреЛрдЧ рддрд░реНрдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕реЗрд╡рд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛редрдЗрд╕ рд╕реНрддрд░ рдкрд░ рдЗрд╕ рд╕реЗрд╡рд╛ рд╕реЗ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд╛рд╣рддреЗ рд╣реИрдВ:- рдорд╛рд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
- рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рд╡рд╣ рдкрд╣рд▓реЗ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддреЛ рдорд╛рд▓ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
- рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рд╡рд╛рдкрд╕ рд▓реМрдЯ рдЖрдП, рдЕрдЧрд░ рд╕рд╛рдорд╛рди рдкрд╣рд▓реЗ рд╕реЗ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдерд╛ред
рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЬреЛ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рд╕реЗрд╡рд╛ рдФрд░ рдЕрдиреБрдорд╛рдирд┐рдд рдПрдХ рдХреЗ рдмреАрдЪ рдЕрдиреБрдмрдВрдз рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:- рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк рддреБрд░рдВрдд рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрд╡реЗрджрди рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрджрд┐ рдХреЛрдИ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рдЙрддреНрдкрд╛рдж рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлрд┐рд▓рд╣рд╛рд▓ рдпрд╣ рд╕реЗрд╡рд╛ рдмрд╕ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреА рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЯреАрдУрдЖрд░ рдХреЗ рдкрд╣рд▓реЗ рдкрдврд╝рдиреЗ рдХреЗ рдареАрдХ рдмрд╛рдж рдпрд╣ рд╕рд╡рд╛рд▓ рдЙрдардирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛, рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рдкреНрд░рдгрд╛рд▓реА рддреИрдпрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдпрд╣ рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдереЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЗрдХрд╛рдИ рд╣реЛрдЧреА рдЬреЛ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреЛрдВ рдХреА рдХрдЯрд╛рдИ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ: рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкреИрджрд╛ рд╣реБрдП рдереЗред
- -, . тАФ , . , , , , , , . . 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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХрд╛ рдХреЛрдб рдЕрднреА рднреА рдмрд╣реБрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдорд╛рдорд▓рд╛ рдХрд╛рд░реНрдпрдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдорджрдж рдорд┐рд▓реАред