2017-04-10 49 views
0

我想要使用it.ozimov.springboot.mail.service.EmailService發送消息的單元測試。 https://github.com/ozimov/spring-boot-email-tools 這裏是我的MailService的:如何測試it.ozimov.springboot電子郵件?

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); 
    } 
} 

我用訛詐進行測試,但它不工作:

@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()); 
    } 
} 

當我得到這個結果:

java.lang.AssertionError: 
Expected :1 
Actual :0 

有人可能有任何想法我做錯了什麼?由於MailService在控制器中工作(它發送電子郵件),但測試不起作用。

回答

0

問題是您使用模擬EmailService的單元測試與GreenMail一起使用,旨在支持集成測試。

如果你看看使用過的庫,你會看到不同之處。例如。看看this context-based test