Spring MVC:JUnit Test中的ServletContext?

时间:2015-06-18 14:52:52

标签: java spring spring-mvc servlets junit

由于我是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.getPropertyConfig类在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尚未被加载。

我可以在这里找到什么......?

1 个答案:

答案 0 :(得分:1)

服务不应该依赖于Web层,您应该有两个应用程序上下文:一个用于服务,一个用于Web,仅使用服务用于测试(服务)。您有一个不应该存在的依赖项,服务代码可以工作,因为您在发送时获取属性,但在初始化时,服务无法访问该属性,因为它仍然必须由init-servlet配置。 / p>

除了从Servlet初始化之外,您应该在服务应用程序上下文中创建一个bean,而不是使用init-param,您可以使用bean属性进行配置。另一种选择是使用服务类本身来保存属性并进行初始配置。