2017-03-15 127 views
1

我有運行該應用程序時運行良好的類。在Spring Boot中測試時注入MailClient

@Service("bookManager") 
public class BookManagerImpl implements BookManager { 

    private MailClient mailClient; 

.. 

} 

    @Service 
public class MailClient { 

    protected static final Logger looger = LoggerFactory.getLogger(MailClient.class); 

    @Autowired 
    private JavaMailSender mailSender; 

    private MailContentBuilder mailContentBuilder; 

    @Autowired 
    public MailClient(JavaMailSender mailSender, MailContentBuilder mailContentBuilder) { 
     this.mailSender = mailSender; 
     this.mailContentBuilder = mailContentBuilder; 
    } 

    //TODO: in a properties 
    public void prepareAndSend(String recipient, String message) { 
     MimeMessagePreparator messagePreparator = mimeMessage -> { 
      MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage); 
      messageHelper.setFrom("[email protected]"); 
      messageHelper.setTo(recipient); 
      messageHelper.setSubject("Sample mail subject"); 
      String content = mailContentBuilder.build(message); 
      messageHelper.setText(content, true); 
     }; 
     try { 
      if (looger.isDebugEnabled()) { 
       looger.debug("sending email to " + recipient); 
      } 
      mailSender.send(messagePreparator); 
     } catch (MailException e) { 
      looger.error(e.getMessage()); 
     } 
    } 

} 

我想創建一個用於測試的ServiceConfig,但我不知道如何將類實例的MailClient因爲沒有默認構造函數和構造的MailClient()是未定義

@Configuration 
public class ServiceConfig { 

    @Bean 
    public SmsService smsService() { 
     return new AWSSMSSender(); 
    } 

    @Bean 
    public MailClient mailClient() { 
     return new MailClient(); 
    } 
} 

使用提出的解決方案:

return new MailClient(null, null) { 
     @Override 
     public void prepareAndSend(String recipient, String message) 
     { 
      // do nothing 
     } 
    }; 

我得到這個錯誤:

No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSender' available: expected at least 1 bean which qualifies as autowire candidate. 
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
+0

什麼是'MailClient'?它來自哪個庫? – Gregg

+0

爲什麼你爲字段mailSender指定一個額外的@Autowired?我認爲這是多餘的,因爲你已經通過構造函數注入了依賴關係... –

+0

是真的,只是爲了嘗試。沒有它,我得到了相同的錯誤 –

回答

0

這取決於你想做什麼,在測試中發送電子郵件(也許用一個測試smpt服務器)或者只是模擬發送。在第二種情況下,您可以繼承MailClient的子類以便在prepareAndSend中不執行任何操作,然後使用它的一個實例。

return new MailClient(null, null) { 
     @Override 
     public void prepareAndSend(String recipient, String message) 
     { 
      // do nothing 
     } 
    }; 
0

你應該使用Stubbing。

存根方法易於使用,並且不涉及單元測試的額外依賴性。基本技巧是將協作者作爲具體的類來實現,它只展現了被測試的類所需的協作者整體行爲的一小部分。作爲例子,考慮服務實現正在測試中的情況。