0

在Spring中,如何在junit测试中使用tomcat位置conf/context.xml中的上下文参数或者如何在junit中创建上下文参数

<Context>
    <Parameter name="mail_host" value="smtp.gmail.com" override="true"/>
</Context>

我在我的代码中实现了上述参数,正如我在
@Value(“#{contextParameters.mail_host}”)下面指定的那样。当我使用tomcat时它工作正常。

但是当在junit中运行时,我收到一个错误'字段或属性'contextParameters'在'org.springframework.beans.factory.config.BeanExpressionContext'类型的对象上找不到

请帮助我,我在这一点上很挣扎。在此先感谢

4

2 回答 2

1

您可以在运行测试之前构建 JNDI,并且在测试中您可以从上下文中检索信息。看看这个例子,他是如何在此处使用 jndi 模拟注入数据源的。你的上下文看起来像这样(在实际的tomcat中)

<Resource name="jdbc/TestDB"
          auth="Container"
          type="javax.sql.DataSource"
          username="root"
          password="password"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/mysql"/>

所以现在我们想要模拟这个,就好像我们将使用 JNDI 检索它一样。因此,在 JUnit 测试中,我们希望设置 Before 类。请注意,此处并未显示所有信息(在 @Before 中构造数据源),但您明白了。

@BeforeClass
    public static void setUpClass() throws Exception {
        // rcarver - setup the jndi context and the datasource
        try {
            // Create initial context
            System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
                "org.apache.naming.java.javaURLContextFactory");
            System.setProperty(Context.URL_PKG_PREFIXES, 
                "org.apache.naming");            
            InitialContext ic = new InitialContext();

            ic.createSubcontext("java:");
            ic.createSubcontext("java:/comp");
            ic.createSubcontext("java:/comp/env");
            ic.createSubcontext("java:/comp/env/jdbc");

            // Construct DataSource
            OracleConnectionPoolDataSource ds = new OracleConnectionPoolDataSource();
            ds.setURL("jdbc:oracle:thin:@host:port:db");
            ds.setUser("MY_USER_NAME");
            ds.setPassword("MY_USER_PASSWORD");

            ic.bind("java:/comp/env/jdbc/nameofmyjdbcresource", ds);
        } catch (NamingException ex) {
            Logger.getLogger(MyDAOTest.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

在您的测试中,您可以获得此信息

Context initContext = new InitialContext();
        Context webContext = (Context)initContext.lookup("java:/comp/env");

        DataSource ds = (DataSource) webContext.lookup("jdbc/nameofmyjdbcresource");

希望能帮助到你。 编辑 例如

MyMailHost mailHost = new MyMailHost();
mailHost.setName("mail_host");
mailHost.setValue("smtp.gmail.com");
mailHost.setOverride(true);

 ic.bind("java:/comp/env/jdbc/mymailhost", mailHost);

in @Test
Context initContext = new InitialContext();
            Context webContext = (Context)initContext.lookup("java:/comp/env");

            MyMailHost ds = (MyMailHost) webContext.lookup("jdbc/mymailhost");
于 2013-11-08T17:22:35.700 回答
0

我使用的一种解决方案是使用一个简单的属性 bean 在我的测试 spring applicationContext 文件中存根上下文参数。所以在你的情况下:

<util:properties id="contextParameters"> <prop key="mail_host">smtp.gmail.com</prop> </util:properties>

这是处理它的最简单方法。希望能帮助到你!

于 2014-01-09T09:41:29.077 回答