рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдкрд░ рдЯреАрдбреАрдбреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди: рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛

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


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


рдореИрдВ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреА рддрд░рд╣, рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рднрд╛рдЧ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛, рдФрд░ рдЕрдВрдд-рд╕реЗ-рдЕрдВрдд рдкрд░реАрдХреНрд╖рдг рдкрд░ рдЖрдЧреЗ рдмрдврд╝реВрдВрдЧрд╛ред


рдкрд░реАрдХреНрд╖рдг рдкрд┐рд░рд╛рдорд┐рдб


рдкрд░реАрдХреНрд╖рдг рдкрд┐рд░рд╛рдорд┐рдб рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдкрд┐рд░рд╛рдорд┐рдб рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЗрдХрд╛рдИ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд▓реЗрдХрд┐рди рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред


рдЫрд╡рд┐


( рдж рдкреНрд░реИрдХреНрдЯрд┐рдХрд▓ рдЯреЗрд╕реНрдЯ рдкрд┐рд░рд╛рдорд┐рдб рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛)


рдкрд░реАрдХреНрд╖рдг рдкрд┐рд░рд╛рдорд┐рдб рдХрдИ рд╕реНрддрд░реЛрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред


  • UI (рдпрд╛ рдПрдВрдб-рдЯреВ-рдПрдВрдб, E2E ) рдкрд░реАрдХреНрд╖рдг рдХреБрдЫ рдХрдо рд╣реИрдВ рдФрд░ рд╡реЗ рдзреАрдореЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрд╕рд▓реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ - рдХреЛрдИ рдирдХрд▓реА рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕рдордХрдХреНрд╖ рдирд╣реАрдВред рд╡реНрдпрд╡рд╕рд╛рдп рдЕрдХреНрд╕рд░ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА BDD рдЪреМрдЦрдЯреЗ рдпрд╣рд╛рдБ рд░рд╣рддреЗ рд╣реИрдВ (рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдХрдХрдбрд╝реА рджреЗрдЦреЗрдВ)ред
  • рдЙрдирдХреЗ рдмрд╛рдж рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг (рд╕реЗрд╡рд╛, рдШрдЯрдХ - рдкреНрд░рддреНрдпреЗрдХ рдХреА рдЕрдкрдиреА рд╢рдмреНрджрд╛рд╡рд▓реА) рд╣реЛрддреА рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдШрдЯрдХ (рд╕реЗрд╡рд╛) рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреА рд╣реИ, рдЗрд╕реЗ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рд╕реЗ рдореЛрдХреА / рдбрдмрд▓реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрд▓рдЧ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрд╛рд╣рд░реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣реА рд╣реИ - рдпреЗ рдкрд░реАрдХреНрд╖рдг рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ, REST рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ, рдореИрдВ рдПрдХ рд╕рдВрджреЗрд╢ рдХрддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпреЗ рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ рдЬреЛ рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЗ рдПрдХреАрдХрд░рдг рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
  • рдмрд╣реБрдд рдиреАрдЪреЗ рддреНрд╡рд░рд┐рдд рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдХреЛрдб рдХреЗ рдиреНрдпреВрдирддрдо рдмреНрд▓реЙрдХреЛрдВ (рд╡рд░реНрдЧреЛрдВ, рд╡рд┐рдзрд┐рдпреЛрдВ) рдХрд╛ рдкреВрд░реНрдг рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред

рд╕реНрдкреНрд░рд┐рдВрдЧ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рднреА , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрдЬреАрдм рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рднреА рдЬреНрдЮрд╛рди рдмрд┐рд▓реНрдХреБрд▓ рднреА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред E2E рдЯреЗрд╕реНрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ "рдПрдХреАрдХрд░рдг" рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


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


рдПрдВрдб-рдЯреВ-рдПрдВрдб рдЯреЗрд╕реНрдЯ


рддреЛ, рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛:


Feature: A list of available cakes Background: catalogue is updated Given the following items are promoted | Title | Price | | Red Velvet | 3.95 | | Victoria Sponge | 5.50 | Scenario: a user visiting the web-site sees the list of items Given a new user, Alice When she visits Cake Factory web-site Then she sees that "Red Velvet" is available with price ┬г3.95 And she sees that "Victoria Sponge" is available with price ┬г5.50 

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

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


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

рдЗрд╕рд▓рд┐рдП, рдЬреЗрдкреАрдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХреБрдЫ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдЬреЛрдбрд╝реАрдВ:


 implementation('org.springframework.boot:spring-boot-starter-data-jpa') runtime('com.h2database:h2') 

рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ H2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ - рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдПрдХ рдПрдореНрдмреЗрдбреЗрдб рдбреЗрдЯрд╛рдмреЗрд╕, рдЗрди-рдореЗрдореЛрд░реА рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рдеред


рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ JPA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рддреБрд░рдВрдд рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ:


 interface CakeRepository extends CrudRepository<CakeEntity, String> { } 

рдФрд░ рд╕рд╛рд░:


 @Entity @Builder @AllArgsConstructor @Table(name = "cakes") class CakeEntity { public CakeEntity() { } @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; @NotBlank String title; @Positive BigDecimal price; @NotBlank @NaturalId String sku; boolean promoted; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; CakeEntity cakeEntity = (CakeEntity) o; return Objects.equals(title, cakeEntity.title); } @Override public int hashCode() { return Objects.hash(title); } } 

рдЗрдХрд╛рдИ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдмрд╛рддреЗрдВ рд╣реИрдВред


  • @NaturalId sku рдлреАрд▓реНрдб рдХреЗ рд▓рд┐рдП @NaturalId ред рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рд╕рдорд╛рдирддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП "рдкреНрд░рд╛рдХреГрддрд┐рдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛" рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдпрд╛ @Id рдлрд╝реАрд▓реНрдб рдХрд╛ equals / @Id рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд▓реНрдХрд┐ рдПрдХ рд╡рд┐рд░реЛрдзреА рдкреИрдЯрд░реНрди рд╣реИред рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рд╕рдорд╛рдирддрд╛ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреИрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ ред
  • рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд▓реЛрдореНрдмреЛрдХ - рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдпреЛрдЧреА рдЪреАрдЬреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ @Builder - рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдФрд░ @AllArgsConstructor рд▓рд┐рдП рдПрдХ рдмрд┐рд▓реНрдбрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдкрд┐рд░рд╛рдорд┐рдб рдХреЗ рдиреАрдЪреЗ


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


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


 @ExtendWith(MockitoExtension.class) class IndexControllerTest { @Mock CakeFinder cakeFinder; @InjectMocks IndexController indexController; private Set<Cake> cakes = Set.of(new Cake("Test 1", "┬г10"), new Cake("Test 2", "┬г10")); @BeforeEach void setUp() { when(cakeFinder.findPromotedCakes()).thenReturn(cakes); } @Test void shouldReturnAListOfFoundPromotedCakes() { ModelAndView index = indexController.index(); assertThat(index.getModel()).extracting("cakes").contains(cakes); } } 

рдпрд╣ рдПрдХ рд╢реБрджреНрдз рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╣реИ - рдХреЛрдИ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ, рдпрд╣рд╛рдВ рдХреЛрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдореЙрдХрд┐рдЯреЛ рдореЛрдХ рдХреЗ рд▓рд┐рдПред рдФрд░ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рд╕рд┐рд░реНрдл рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ - рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдХреЗ рддрд░реАрдХреЗ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреАрдУрдЬреЗрдУ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ - рдореЙрдбрд▓ рджреЗрдЦреЗрдВ ред рдХреЛрдИ HTTP рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рд╣реИрдВ, рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ, рд╣реЗрдбрд░, JSON, XML - рдпрд╣ рд╕рдм рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рдФрд░ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдЯреИрдХ рдХреЗ рдиреАрдЪреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рдВ, ModelAndView рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ "рд╕рдВрдХреЗрдд" рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд POJO рд╣реИ рдФрд░ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЗрд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рднреА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ UI рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдореИрдВ рдореЙрдХрд┐рдЯреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдЖрдк рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рд╕рдм рдХреБрдЫ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреЗрд╡рд▓ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рд╣реИрдВ - рдореИрдВ рдкрд░реАрдХреНрд╖рдг MockitoExtension.class рд░реВрдк рдореЗрдВ MockitoExtension.class рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ MockitoExtension.class , рдФрд░ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ @Mock рджреНрд╡рд╛рд░рд╛ рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдП рдЧрдП рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдореЛрдХ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ рдФрд░ рдлрд┐рд░ рдЗрди @ рдореЛрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд @InjectMocks рдЧрдП рдлрд╝реАрд▓реНрдб рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрди рдореЛрдХ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ @InjectMocks ред рдЖрдк рдпрд╣ рд╕рдм рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ Mockito.mock() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

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


рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ cakes рдкреИрдХреЗрдЬ рдХреЗ рдЕрдВрджрд░ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рдирд┐рдЬреА рдмрдирд╛ рджрд┐рдпрд╛ рддрд╛рдХрд┐ рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд╣рд░ рдХреЛрдИ рднреА рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░ рд╕рдХреЗред рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ CakeFinder рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ "рдШрдЯрдХ X" рд╣реИред рдпрд╣ рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ "рдХрдиреЗрдХреНрдЯрд░" рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓реЙрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдпрджрд┐ рдореБрдЭреЗ рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдХреБрдЫ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдФрд░ рдЖрдзрд╛рд░ рдХреЛ рдЫреВрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдЗрд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди JpaCakeFinder рд╣реИред рдФрд░ рдЕрдЧрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЙрд╕ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ CakeFinder рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

@DataJpaTest рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЗрдкреАрдП рдХреЗ рд▓рд┐рдП рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг


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


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


  • @AutoConfigureDataJpa
  • @AutoConfigureTestDatabase
  • @AutoConfigureCache
  • @AutoConfigureTestEntityManager
  • @Transactional

рдкрд╣рд▓реЗ рдореИрдВ рдЖрдкрдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛, рдФрд░ рдлрд┐рд░ рдореИрдВ рдЖрдкрдХреЛ рддреИрдпрд╛рд░ рдкрд░реАрдХреНрд╖рдг рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред


@AutoConfigureDataJpa
рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕реЗрдЯ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА ( CrudRepositories рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреАрдврд╝реА), рдлреНрд▓рд╛рдИрд╡реЗ рдФрд░ рд▓рд┐рдХреНрд╡рд┐рдмреЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЯреВрд▓, рдбреЗрдЯрд╛рд╕реЛрд░реНрд╕, рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрдХ рдФрд░ рдЕрдВрддрддрдГ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ - рди рддреЛ рд╡реЗрдм рдПрдорд╡реАрд╕реА рд╕реЗ DispatcherServlet , рди рд╣реА рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдХреЛ рдпрд╣рд╛рдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


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


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


  1. рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рд╕реЗ рдСрдЯреЛ рдбреАрдбреАрдПрд▓ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдЯреЗрд╕реНрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдорд╛рди рд╕реЗрдЯ create-drop рдХрд░рдиреЗ рдХреЗ create-drop рд╕реЗрдЯ рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдЗрдХрд╛рдИ рд╡рд┐рд╡рд░рдг рд╕реЗ рдПрдХ рд╕реНрдХреАрдорд╛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рддреНрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдЧрд╛ред рдпрд╣ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХреА рдПрдХ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдЬреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред
  2. рдлреНрд▓рд╛рдИрд╡реЗ рдпрд╛ рд▓рд┐рдХреНрд╡рд┐рдмреЗрд╕ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдЖрдк рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред


@AutoConfigureCache
рдпрд╣ рд╕рд┐рд░реНрдл рдХреИрд╢ рдХреЛ NoOpCacheManager рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ - рдЕрд░реНрдерд╛рдд рдХреБрдЫ рднреА рдХреИрд╢ рди рдХрд░реЗрдВред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЖрд╢реНрдЪрд░реНрдп рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИред


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


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


рдХреНрдпрд╛ рдХрд┐рд╕реА рдкрд░реАрдХреНрд╖рдг рдХреЛ рд▓реЗрди-рджреЗрди рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╣ рдЗрддрдирд╛ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рд╢реНрди рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ "рдХреНрд▓реАрди" рд╕реНрдерд┐рддрд┐ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, "рд▓рдбрд╝рд╛рдИ" рдХреЛрдб рдореЗрдВ рд▓реЗрдирджреЗрди рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ @Transactional рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдПрдХ рдЕрдкреНрд░рд┐рдп рдЖрд╢реНрдЪрд░реНрдп рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдЧреБрдЬрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдирд╣реАрдВ, рддреЛ рд╕реЗрд╡рд╛ рдореЗрдВ рдПрдХ рд╕рдХреНрд░рд┐рдп рд▓реЗрдирджреЗрди рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рд╡рд┐рдзрд┐ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрдЧреАред рдпрджреНрдпрдкрд┐ рдпрд╣ рдЦрддрд░рдирд╛рдХ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди UI рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде, рд▓реЗрди-рджреЗрди рдХреЗ рдкрд░реАрдХреНрд╖рдг рдЗрддрдиреЗ рдмреБрд░реЗ рдирд╣реАрдВ рд╣реИрдВред рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рджреЗрдЦрд╛, рдЬрдм рдПрдХ рдЧреБрдЬрд░ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдиреЗ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдХреЛ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рдХрд░ рджрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдореМрдЬреВрджрд╛ рд▓реЗрдирджреЗрди рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЛ рдЕрднреА рднреА рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдШрдЯрдХреЛрдВ рдиреЗ рд▓реЗрдирджреЗрди рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рд╡рд╛рдВрдЫрд┐рдд рдореЛрдб рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдкрд░ @Transactional рдПрдиреЛрдЯреЗрд╢рди рдХреЛ "рдмреНрд▓реЙрдХ" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЗрдирджреЗрди рд╢реБрд░реВ рди рдХрд░реЗрдВ)ред

@SpringBootTest рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдЯреЗрд╕реНрдЯ


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


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


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


рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛


рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░реА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЕрд▓рдЧ-рдерд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрд╕рдХреА рдореВрд▓ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╡рд┐рдХрд▓реНрдк @BeforeEach / @BeforeAll рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА, TestEntityManager рдпрд╛ TestEntityManager рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рддреИрдпрд╛рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдпрд╛ рд╡рд╛рдВрдЫрд┐рдд SQL рдХреНрд╡реЗрд░реА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрд╣ @Sql рдПрдиреЛрдЯреЗрд╢рди рд╣реИред рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдЯреЗрд╕реНрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ @BeforeAll , @BeforeAll рдмреНрд▓реЙрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛, рдФрд░ @BeforeAll рдбреЗрдЯрд╛ рдХреА @Transactional рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдЧрд╛ред


 @DataJpaTest class JpaCakeFinderTest { private static final String PROMOTED_CAKE = "Red Velvet"; private static final String NON_PROMOTED_CAKE = "Victoria Sponge"; private CakeFinder finder; @Autowired CakeRepository cakeRepository; @Autowired TestEntityManager testEntityManager; @BeforeEach void setUp() { this.testEntityManager.persistAndFlush(CakeEntity.builder().title(PROMOTED_CAKE) .sku("SKU1").price(BigDecimal.TEN).promoted(true).build()); this.testEntityManager.persistAndFlush(CakeEntity.builder().sku("SKU2") .title(NON_PROMOTED_CAKE).price(BigDecimal.ONE).promoted(false).build()); finder = new JpaCakeFinder(cakeRepository); } ... } 

рд▓рд╛рд▓-рд╣рд░рд╛-рдкрд░рд╛рд╡рд░реНрддрдХ рдЪрдХреНрд░


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


рдбреЗрдЯрд╛ рдХреА рддреИрдпрд╛рд░реА


рдореИрдВ @BeforeAll / @BeforeEach рд╕рд╛рде рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ @BeforeEach рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рднреА рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рддрд╛ @BeforeEach ред @Sql рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ JpaCakeFinderTestWithScriptSetup рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рдПрдХрдорд╛рддреНрд░ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИред


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


рдкрд╣рд▓рд╛ рдкрд░реАрдХреНрд╖рдг рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг


рдкрд╣рд▓рд╛ рдкрд░реАрдХреНрд╖рдг рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╣реИ - findPromotedCakes рдХреЛ рдкреНрд░рдЪрд╛рд░ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдХреЗрдХ рдХрд╛ рд╡рд┐рд╡рд░рдг рдФрд░ рдореВрд▓реНрдп рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рд▓рд╛рд▓


  @Test void shouldReturnPromotedCakes() { Iterable<Cake> promotedCakes = finder.findPromotedCakes(); assertThat(promotedCakes).extracting(Cake::getTitle).contains(PROMOTED_CAKE); assertThat(promotedCakes).extracting(Cake::getPrice).contains("┬г10.00"); } 

рдкрд░реАрдХреНрд╖рдг, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдХреНрд░реИрд╢ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдЦрд╛рд▓реА рд╕реЗрдЯ рджреЗрддрд╛ рд╣реИред


рдЧреНрд░реАрди


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


  public Set<Cake> findPromotedCakes() { Spliterator<CakeEntity> cakes = this.cakeRepository.findAll() .spliterator(); return StreamSupport.stream(cakes, false).map( cakeEntity -> new Cake(cakeEntity.title, formatPrice(cakeEntity.price))) .collect(Collectors.toSet()); } private String formatPrice(BigDecimal price) { return "┬г" + price.setScale(2, RoundingMode.DOWN).toPlainString(); } 

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

Refactor


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


рджреВрд╕рд░рд╛ рдкрд░реАрдХреНрд╖рдг


рд▓реЗрдХрд┐рди рджреВрд╕рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреЛрдИ рднреА рдкреНрд░реЛрдореЛрдЯреЗрдб рдХреЗрдХ findPromotedCakes рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдирд╣реАрдВ findPromotedCakes ред


  @Test void shouldNotReturnNonPromotedCakes() { Iterable<Cake> promotedCakes = finder.findPromotedCakes(); assertThat(promotedCakes).extracting(Cake::getTitle) .doesNotContain(NON_PROMOTED_CAKE); } 

рд▓рд╛рд▓


рдкрд░реАрдХреНрд╖рдг, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рдХреНрд░реИрд╢ рд╣реЛрддрд╛ рд╣реИ - рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рджреЛ рд░рд┐рдХреЙрд░реНрдб рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдмрд╕ рдЙрди рд╕рднреА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред


рдЧреНрд░реАрди


рдФрд░ рдлрд┐рд░ рд╕реЗ рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ - рдФрд░ рдиреНрдпреВрдирддрдо рдХреЛрдб рдХреНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЯреЗрд╕реНрдЯ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ? рдЪреВрдВрдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдзрд╛рд░рд╛ рдФрд░ рдЗрд╕рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╣реИ, рдЖрдк рдмрд╕ рд╡рд╣рд╛рдВ рдПрдХ filter рдмреНрд▓реЙрдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред


  public Set<Cake> findPromotedCakes() { Spliterator<CakeEntity> cakes = this.cakeRepository.findAll() .spliterator(); return StreamSupport.stream(cakes, false) .filter(cakeEntity -> cakeEntity.promoted) .map(cakeEntity -> new Cake(cakeEntity.title, formatPrice(cakeEntity.price))) .collect(Collectors.toSet()); } 

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


Refactor


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


 interface CakeRepository extends CrudRepository<CakeEntity, String> { Iterable<CakeEntity> findByPromotedIsTrue(); } 

рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП, рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдиреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдЙрддреНрдкрдиреНрди рдХреА, рдЬреЛ рдХрд┐ select from cakes where promoted = true рдЧрдП рдлреЙрд░реНрдо рдХреА рдПрдХ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧреА, select from cakes where promoted = true ред рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдХреНрд╡реЗрд░реА рдкреАрдврд╝реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВред


  public Set<Cake> findPromotedCakes() { Spliterator<CakeEntity> cakes = this.cakeRepository.findByPromotedIsTrue() .spliterator(); return StreamSupport.stream(cakes, false).map( cakeEntity -> new Cake(cakeEntity.title, formatPrice(cakeEntity.price))) .collect(Collectors.toSet()); } 

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


рдЙрддреНрдкрд╛рджрди рдЖрдзрд╛рд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди


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


рд╕рдм рдХреБрдЫ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ application.yml рдореЗрдВ рдЕрдиреБрднрд╛рдЧ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ:


 datasource: url: jdbc:h2:./data/cake-factory 

рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ ./data рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ ./data ред рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдлрд╝реЛрд▓реНрдбрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ - @DataJpaTest @AutoConfigureTestDatabase рдПрдиреЛрдЯреЗрд╢рди рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрджрд▓ рджреЗрдЧрд╛ред


, тАФ data.sql schema.sql . , Spring Boot . , , , .

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


, , , TDD .


Spring Security тАФ Spring, .

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


All Articles