1 분 소요

문제 상황

회원가입시 인증코드를 메일로 전송하는 기능을 구현하기 위해 타임리프로 인증코드 메일 템플릿을 만들고 MailContentBuilder 라는 클래스에서 해당하는 템플릿을 채우는 코드를 구현하였습니다.

public class MailContentBuilder {	
	private final TemplateEngine templateEngine;

	public String build(final String template, final Map<String, String> contents) {
		Context context = new Context();

		for (String key : contents.keySet()) {
			context.setVariable(key, contents.get(key));
		}

		return templateEngine.process(template, context);
	}
}

코드 실행은 문제가 없었지만 아래와 같이 테스트 코드를 작성하였더니 TemplateEngine 관련해서 NPE가 발생했습니다.

@ExtendWith(MockitoExtension.class)
class MailContentBuilderTest {
	@Mock
	private TemplateEngine templateEngine;

	@InjectMocks
	private MailContentBuilder mailContentBuilder;

	@DisplayName("메일 템플릿 채우기")
	@Test
	public void mail_content_build() {
		//given
		String template = "test template";
		Map<String, String> contents = new HashMap<>();

		//when
		mailContentBuilder.build(template, contents);

		//then
		then(templateEngine).should(times(1)).process(anyString(), any(Context.class));
	}
}

해결

아래와 같이 TemplateEngine 이 아닌 ITemplateEngine 으로 변경하면 정상적으로 동작합니다.

public class MailContentBuilder {	
	private final ITemplateEngine templateEngine;

	public String build(final String template, final Map<String, String> contents) {
		Context context = new Context();

		for (String key : contents.keySet()) {
			context.setVariable(key, contents.get(key));
		}

		return templateEngine.process(template, context);
	}
}

@ExtendWith(MockitoExtension.class)
class MailContentBuilderTest {
	@Mock
	private ITemplateEngine templateEngine;

	@InjectMocks
	private MailContentBuilder mailContentBuilder;

	@DisplayName("메일 템플릿 채우기")
	@Test
	public void mail_content_build() {
		//given
		String template = "test template";
		Map<String, String> contents = new HashMap<>();

		//when
		mailContentBuilder.build(template, contents);

		//then
		then(templateEngine).should(times(1)).process(anyString(), any(Context.class));
	}
}

reference

참고1

댓글남기기