[ํ ์คํธ] No qualifying bean of type 'tobyspring.splearn.application.required.EmailSender' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memberService' defined in file [/Users/eundms/IdeaProjects/splearn/build/classes/java/main/tobyspring/splearn/application/MemberService.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'tobyspring.splearn.application.required.EmailSender' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
๋๋ @SpringBootTest๋ฅผ ํ์ฉํ ํ ์คํธ๋ฅผ ์์ฑ์ค์ด๋ค
@SpringBootTest
public class MemberRegisterManualTest {
@Autowired
private MemberRegister memberRegister;
@Test
void register(){
Member member = memberRegister.register(MemberFixture.createRegisterRequest());
assertThat(member.getId()).isNotNull();
assertThat(member.getStatus()).isEqualTo(MemberStatus.PENDING);
}
}
์๋์ ๊ฐ์ด MemberService๊ฐ ์์ฑ๋์ด ์๋ค
@Service
@RequiredArgsConstructor
public class MemberService implements MemberRegister {
private final MemberRepository memberRepository;
private final EmailSender emailSender;
private final PasswordEncoder passwordEncoder;
@Override
public Member register(MemberRegisterRequest registerRequest) {
Member member = Member.register(registerRequest, passwordEncoder);
memberRepository.save(member);
emailSender.send(member.getEmail(), "๋ฑ๋ก์ ์๋ฃํด์ฃผ์ธ์", "์๋ ๋งํฌ๋ฅผ ํด๋ฆญํด์ ๋ฑ๋ก์ ์๋ฃํด์ฃผ์ธ์");
return member;
}
}
Spring Context์ ๋ฑ๋ก๋์ด ์๋ MemberRegister์ ๊ฐ์ ธ์ค๋ ๋ฐ,
์ด ์์์ ์ฌ์ฉ๋๋ EmailSender, PasswordEncoder๊ฐ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋์ด ์์ง ์๋ค (๊ตฌํ์ฒด ์๋ ์ธํฐํ์ด์ค์)
public interface PasswordEncoder {
String encode(String password);
boolean matches(String password, String passwordHash);
}
public interface EmailSender {
void send(Email email, String subject, String body);
}
- @Bean์ผ๋ก emailSender, passwordEncoder๋ฅผ Bean์ผ๋ก ๋ฑ๋กํ๋ค
- ๊ทธ๋ฆฌ๊ณ MemberTestConfiguration ์ ๋ ๋ฆฝ๋ ํ์ผ๋ก ์กด์ฌํ๋ค
@TestConfiguration
class MemberTestConfiguration {
@Bean
public EmailSender emailSender(){
return (email, subject, body) -> System.out.println("sending email" + email);
}
@Bean
public PasswordEncoder passwordEncoder(){
return MemberFixture.createPasswordEncoder();
}
}
์? @SpringBootTest ๊ฐ ๋ถ์ MemberRegisterManualTest๊ฐ MemberTestConfiguration ์ ์ฌ์ฉํด์ผ ํจ์ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค
@SpringBootTest
@Import(MemberTestConfiguration.class)
public class MemberRegisterManualTest {
@Autowired
private MemberRegister memberRegister;
@Test
void register(){
Member member = memberRegister.register(MemberFixture.createRegisterRequest());
assertThat(member.getId()).isNotNull();
assertThat(member.getStatus()).isEqualTo(MemberStatus.PENDING);
}
}
@TestConfiguration ๊ด๋ จ ์ค๋ช ๊ณผ ์ค์ ๋์์ด ๋ค๋ฅธ ... - ์ธํ๋ฐ | ์ปค๋ฎค๋ํฐ ์ง๋ฌธ&๋ต๋ณ
๋๊ตฌ๋ ํจ๊ปํ๋ ์ธํ๋ฐ ์ปค๋ฎค๋ํฐ. ๋ชจ๋ฅด๋ฉด ๋ฌป๊ณ , ํด๋ต์ ์ฐพ์๋ณด์ธ์.
www.inflearn.com