在Spring中,如何在junit测试中的tomcat位置conf / context.xml中使用上下文参数,或者如何在junit中创建上下文参数
<Context>
<Parameter name="mail_host" value="smtp.gmail.com" override="true"/>
</Context>
我正在我的代码中实现上述参数,如下所示 @Value(“#{contextParameters.mail_host}”)。当我使用tomcat时工作正常。
但是我收到错误'字段或属性'contextParameters'在'org.springframework.beans.factory.config.BeanExpressionContext'类型的对象上找不到 在junit中运行时
请帮助我,我在这一点上挣扎。谢谢你提前
答案 0 :(得分:1)
您可以在运行测试之前构建JNDI,在测试中,您可以从上下文中检索信息。看一下这个例子,他如何模拟使用jndi here注入数据源。 你的上下文看起来像这样(在实际的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测试中我们想要在class之前设置。请注意,这里并没有显示所有信息(在@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");
答案 1 :(得分:0)
我使用的一个解决方案是使用简单的属性bean在我的测试spring applicationContext文件中存储上下文参数。 所以在你的情况下:
<util:properties id="contextParameters">
<prop key="mail_host">smtp.gmail.com</prop>
</util:properties>
这是处理它的最简单方法。 希望它有所帮助!