由于我是Spring MVC的新手,请帮助我减少我的困惑。
我有这项服务,需要为它编写单元测试:
public class SendEmailServiceImpl implements SendEmailService {
private final static Logger logger = LoggerFactory.getLogger(SendEmailServiceImpl.class);
@Autowired
private JavaMailSender mailSender;
public void sendEmail(String id) {
logger.info("Preparing the mail");
String mailFrom = Config.getProperty("email.from");
...
}
}
所以这个sendEmail-Method使用静态方法Config.getProperty
。 Config
类在Servlet init()
- 方法:
import java.io.File;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
public class ConfigLoader extends HttpServlet {
private static final long serialVersionUID = 923456796732565609L;
public void init() {
String configPath = getServletContext().getInitParameter("ConfigPath");
Config.init(configPath);
System.setProperty("org.owasp.esapi.resources", configPath + "/conf");
cleanupDirectories(getServletContext());
}
}
所以最后我为我的sendEmail()
方法的测试用例我需要访问servlet上下文。
给予official docs我的印象是@ContextConfiguration
和@WebAppConfiguration
注释可以解决我的问题。所以我的单元测试看起来像:
import javax.servlet.ServletContext;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import SendEmailService;
@WebAppConfiguration("file:application/webapp")
@ContextConfiguration("file:application/webapp/WEB-INF/dispatcher-servlet.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class SendEmailServiceImplTest {
@Autowired
private SendEmailService sendEmailBean;
@Autowired
ServletContext context;
@Test
public void sendMail() throws Exception {
sendEmailBean.sendEmail("b884d8eba6b2438e8e3ee37a69229c98");
}
}
但遗憾的是Config.init(configPath);
从未被调用过,这意味着ServletContext尚未被加载。
我可以在这里找到什么......?
答案 0 :(得分:1)
服务不应该依赖于Web层,您应该有两个应用程序上下文:一个用于服务,一个用于Web,仅使用服务用于测试(服务)。您有一个不应该存在的依赖项,服务代码可以工作,因为您在发送时获取属性,但在初始化时,服务无法访问该属性,因为它仍然必须由init-servlet配置。 / p>
除了从Servlet初始化之外,您应该在服务应用程序上下文中创建一个bean,而不是使用init-param,您可以使用bean属性进行配置。另一种选择是使用服务类本身来保存属性并进行初始配置。