2017-04-10 8 views
0

it.ozimov.springboot.mail.service.EmailService을 사용하여 메시지를 보내는 단위 테스트를 만들고 싶습니다. 여기 https://github.com/ozimov/spring-boot-email-tools 내 MailService 인터페이스입니다 :it.ozimov.springboot를 테스트하는 방법 Email?

import com.google.common.collect.Lists; 
import it.ozimov.springboot.mail.model.Email; 
import it.ozimov.springboot.mail.model.defaultimpl.DefaultEmail; 
import it.ozimov.springboot.mail.service.EmailService; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.stereotype.Service; 

import javax.mail.internet.AddressException; 
import javax.mail.internet.InternetAddress; 
import java.io.UnsupportedEncodingException; 

@Service 
public class MailService { 
    @Autowired 
    public EmailService emailService; 

    @Value("${spring.mail.username}") 
    private String username; 

    public void sendMail(String subject, String messageContent, String recipient) 
      throws UnsupportedEncodingException, AddressException { 
     final Email email = DefaultEmail.builder() 
       .from(new InternetAddress(username)) 
       .to(Lists.newArrayList(new InternetAddress(recipient))) 
       .subject(subject) 
       .body(messageContent) 
       .encoding("UTF-8").build(); 
     emailService.send(email); 
    } 
} 

그리고 테스트를 만들기 위해 그린 메일을 사용하지만, 그것은 작동하지 않습니다

java.lang.AssertionError: 
Expected :1 
Actual :0 
이있어 나는 그 결과로

@RunWith(SpringJUnit4ClassRunner.class) 
public class MailServiceTest { 
    private static final String USER_PASSWORD = "abcdef123"; 
    private static final String USER_NAME = "hascode"; 
    private static final String EMAIL_USER_ADDRESS = "[email protected]"; 
    private static final String EMAIL_TO = "[email protected]"; 
    private static final String EMAIL_SUBJECT = "Test E-Mail"; 
    private static final String EMAIL_TEXT = "This is a test e-mail."; 
    private static final String LOCALHOST = "127.0.0.1"; 
    private GreenMail mailServer; 

    @InjectMocks 
    private MailService mailService = new MailService(); 

    @Mock 
    private EmailService emailService; 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
     mailServer = new GreenMail(ServerSetupTest.SMTP); 
     mailServer.start(); 
     mailServer.setUser(EMAIL_USER_ADDRESS, USER_NAME, USER_PASSWORD); 
    } 

    @After 
    public void tearDown() { 
     mailServer.stop(); 
    } 

    @Test 
    public void getMails() throws IOException, MessagingException, 
      UserException, InterruptedException { 
     String subject = "Some subject"; 
     String body = "Some contents."; 
     String recipient = "[email protected]"; 

     ReflectionTestUtils.setField(mailService, "username", "bla"); 
     mailService.sendMail(subject, body, recipient); 

     MimeMessage[] messages = mailServer.getReceivedMessages(); 
     assertNotNull(messages); 
     assertEquals(1, messages.length); 
     MimeMessage m = messages[0]; 
     assertEquals(EMAIL_SUBJECT, m.getSubject()); 
     assertTrue(String.valueOf(m.getContent()).contains(EMAIL_TEXT)); 
     assertEquals(EMAIL_TO, m.getFrom()[0].toString()); 
    } 
} 

누군가 내가 뭘 잘못하고 있는지 어떤 생각을 가지고 있을까요? MailService는 컨트롤러에서 작동하기 때문에 (이메일을 전송 함) 테스트는 작동하지 않습니다.

답변

0

문제는 통합 테스트를 지원하는 GreenMail과 함께 사용되는 조롱 된 EmailService로 단위 테스트를 사용했기 때문입니다.

사용 된 라이브러리를 살펴보면 차이점을 알 수 있습니다. 예 : 살펴보기 this context-based test

관련 문제