【问题标题】:Is this Spring training useful? [closed]这个春季培训有用吗? [关闭]
【发布时间】:2009-11-09 19:45:49
【问题描述】:

我们有一个基于 Spring + Ibatis 的 J2EE 应用程序。我计划用测试用例来包装我们的 DAO(调用 iBatis 模板……通过获取 spring bean)。我对 JUnit 没有太多经验,所以我认为只需创建我的 DAO 的一个对象,然后调用其中一个方法就可以了。但我错了,原来整个 J2EE 应用程序在 appserver(容器)上运行,但显然 JUnit 测试用例在容器之外。所以,在我的测试用例中,当我创建 dao 的对象并调用一个方法时......它在我的 DAO 方法中的这样一行上失败了

ApplicationInitializer.getApplicationContext().getBean("myMapclientBean");

所以我在 Google 上进行了搜索……偶然发现了一些帖子,并按照我最终找到了 Spring 的 4 day training course 的试管。

想听听你对这门课程的看法吗?对得起价格吗?一个人也可以自己学习这些东西吗?通过跟随几本书? (也许不是 4 天,而是一个月以上)。

哦,我仍然无法对这些 DAO 进行单元测试...>_

【问题讨论】:

  • 如果你在测试中接触了数据库,那么它就不是单元测试;这是一个集成测试。现在使用 JUnit 也可以进行集成测试是完全可以的,但是您需要注意其中的区别。 Spring 为 JUnit 和 TestNG 提供集成测试支持 - 查看参考手册。
  • 谢谢。知道这种差异也将帮助我进行谷歌搜索。
  • 您可能想打开一个新问题来处理单元测试问题。这样你可能会得到更好的回应,因为这个真的更多是关于核心弹簧课程的。

标签: java spring jakarta-ee junit


【解决方案1】:

大约一年半前,我参加了 Core Spring 课程。从那时起,教学大纲显然发生了一些变化,尽管它仍然非常相似。教练非常称职。在参加本课程之前,我正在使用 Spring,但在课堂上我觉得我学会了如何做得更好。

我认为您可能可以从书籍、Spring 的在线文档和源代码本身中获取所有原始信息,但该课程所做的是将所有内容连接在一起并教授最佳实践。也就是说,不仅仅是“如何”,还有“为什么”和“何时”你应该使用这样那样的功能。这就是为什么我觉得我的技能提高了。

教师很乐意回答有关课堂作业之外的具体现实问题的问题。所以带着问题来是个好主意。

课程不便宜。是否值得取决于您是否在课堂上做得很好,而不是自学,以及利用在线社区和同伴来获得书籍无法提供的最佳实践的感觉。另外,请记住,Spring 在不断发展。尽管您可以从课程中打下良好的基础,但您仍然需要适应未来的新功能(或参加其他课程)。

【讨论】:

  • 也参加了课程,我同意@Jeff 所说的一切。 IMO 非常值得。
  • 谢谢大家。那很有帮助。我会问我的小公司,看看他们是否愿意....或者我会开始潜伏在工作周围。SO :)。既然你们接受了培训,能否告诉我如果 J2EE 应用程序在容器(应用程序服务器)中工作,Testcases 将如何工作。我的意思是所有的数据源和东西都在应用服务器上......那么当你的 DAO 从应用服务器获取数据源时 jUnit 将如何工作?
  • 您的描述听起来更像是集成测试而不是单元测试......但在测试 DAO 和数据库时似乎总是如此。您可能想查看 AbstractTransactionalDataSourceSpringContextTests 类。这也可能对您有用:iamjosh.wordpress.com/2007/12/11/…
【解决方案2】:

回答问题的第二部分(我没有春季课程的经验,所以无法评论)。

如果您使用的是 Junit 3.8 或更早版本,您可以在 Junit 测试中使用已定义的应用程序上下文,然后像在服务器容器中一样通过让您的测试用例扩展 AbstractTransactionalDataSourceSpringContextTests 来实例化 DAO。

如果您使用更高版本的 Junit (4+),您可以使用 Spring TestContext 框架和注释。

这两个解释都比我从Spring 和注释上的RefCard 解释得更好

【讨论】:

  • -1 - AbstractTransactionalDataSourceSpringContextTests 是一个流产。 Spring 提供的许多测试用例扩展也是如此。 AbstractSingleSpringContextTests 是你应该停止使用它们的地方 - 在那之后它们变得越来越糟糕。
  • 肯定是意见。只需显示选项,提出问题的人就可以找到自己的方法来完成任务。
  • 我使用了 AbstractTransactionalDataSourceSpringContextTests 路由。为我工作。我已经为我们工作中的远程处理项目实例化了 junit,这构成了我们的 junit 测试的基础。通过 公共类 TestBase 扩展 AbstractDependencyInjectionSpringContextTests
【解决方案3】:

解决手头的问题:

在使用 Spring 时,您的 bean 不应该真的去 ApplicationContext 并询问他们需要的 bean - 它们应该提供设置器(或构造器)以便可以注入依赖项。

听起来设计这些类的人做了与依赖注入相反的事情。

【讨论】:

  • 在后台......上下文就像这样 springContext = WebApplicationContextUtils .getWebApplicationContext(event.getServletContext());您能否提供一些您认为它们应该如何使用的示例,以便 Junit 测试用例能够在容器外使用这些 bean?
  • Spring MVC 教程,尽管它是专门针对 MVC 框架的,但它是 IMO 对 Spring 的极好介绍。 static.springframework.org/docs/Spring-MVC-step-by-step 依赖注入意味着一个类给定它的依赖,而不是它出去找到它们。
【解决方案4】:

我使用了 AbstractTransactionalDataSourceSpringContextTests 路由。为我工作。我已经为我们工作中的远程处理项目实例化了 junit,这构成了我们的 junit 测试的基础。通过

import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
public class TestBase extends AbstractDependencyInjectionSpringContextTests
{
  protected String[] getConfigLocations()
  {
    return new String[] { "classpath:conf/dataAccessContext.xml",     "classpath:conf/applicationContext-domain.xml",
    "classpath:conf/applicationContext-service.xml", "classpath:conf/applicationContext-dao.xml" };
  }

  protected Object getBeanToTest(String beanName)
  {
    return applicationContext.getBean(beanName);
  }

  protected Object getBeanToTest(Class clazz)
  {
    return applicationContext.getBean(clazz.getName());
  }

}

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2010-09-11
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多