我有一个相对较小的 Java 库,它实现了几十个 bean(没有数据库或 GUI)。我创建了一个 Spring Bean 配置文件,其他 Java 项目使用它来将我的 bean 注入(inject)到他们的东西中。
我现在第一次尝试使用 Spring Test 将其中一些 bean 注入(inject)我的 junit 测试类(而不是简单地实例化它们)。
我这样做部分是为了学习 Spring Test,部分是为了强制测试使用我为其他人提供的相同 bean 配置文件。
在 Spring 文档中说我需要使用 Spring 附带的“TestContext”类创建应用程序上下文。我相信这应该在我通过测试类上的 @ContextConfiguration 注释引用的 spring XML 文件中完成。
@ContextConfiguration({"/test-applicationContext.xml"})
但是,没有提示要在文件中放入什么!
当我在 Eclipse 中运行我的测试时,它会报错说“无法加载应用程序上下文”......当然。
更新:
这里是 test-applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<description>Holds application context for testing of the domain module.</description>
<!-- Imports the uuid generator bean definitions -->
<import resource="resources/domain-uuid.xml"/>
</beans>
我的项目目录是这样的:
domain/
src/
main/
java/
resources/
test/
java/
resources/ (location of test-applicationContext.xml)
为了好玩,我还尝试通过“mvn clean test”从 mvn 命令行构建,但出现以下错误,这可能是我真正的问题:
package org.springframework.test.context does not exist
package org.springframework.test.context.junit4 does not exist
cannot find symbol
symbol: class ContextConfiguration
@ContextConfiguration({"/resources/test-applicationContext.xml"})
cannot find symbol
symbol: class SpringJUnit4ClassRunner
@RunWith(SpringJUnit4ClassRunner.class)
最佳答案
在应用程序上下文文件中放置什么。 TestContext 框架的工作方式是它允许您在集成测试的上下文中重用应用程序连接。所以在大多数情况下,你在应用上下文配置文件中放置的测试并没有什么特别之处。如果您的 Controller 在您的应用程序中具有服务 bean 依赖项,那么它也将在您的集成测试中具有该依赖项。如果您的 DAO 在您的应用程序中有一个 SessionFactory,那么您的集成测试也是如此。这样,当您编写集成测试时,您不必重新连接所有这些东西。很酷。
我在上面说大部分是因为我想到了至少一个异常(exception)。通常,您的应用程序将使用 JNDI 来定位 DataSource,但在集成测试(至少是容器外集成测试)中,您通常不会有可用的 JNDI 环境。因此,您通常应该将 DataSource bean 创建隔离到一个单独的文件中,并为您的实时应用程序使用 JNDI 版本,并为您的集成测试使用非 JNDI 版本(例如,只需创建一个直接的 BasicDataSource )。这是前者的一个例子:
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/myStoreDS" resource-ref="true"/>
这是后者的一个例子:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="${dataSource.driverClassName}"
p:url="${dataSource.url}"
p:username="${dataSource.username}"
p:password="${dataSource.password}" />
这些将放在单独的文件中。第一个可能进入beans-datasource.xml用于正常的应用程序使用和 beans-datasource-it.xml 中的第二个用于集成测试。普通应用程序使用和集成测试常用的配置(即大多数情况下的绝大多数 bean 配置)应该在一个或多个通用配置文件中。
此外,Spring 3 引入了一个新的 jdbc命名空间,允许您创建嵌入式数据库,如 HSQLDB 数据库或 Derby 数据库等。它看起来像这样:
<jdbc:embedded-database id="dataSource">
<jdbc:script location="classpath:hsql/schema.sql" />
<jdbc:script location="classpath:hsql/test-data.sql" />
</jdbc:embedded-database>
这将取代 BasicDataSource上面描述的配置,如果你想使用这个。
为什么会发生错误。您看到的错误发生是因为您的 @ContextConfiguration value 隐含地指示应用程序上下文文件应该在类路径上。 重要提示: 删除 /resources片。那是Maven的内脏;当它构建您的 JAR 或 WAR 时,它会复制 resources 的 内容目录进入你的类路径,而不是 resources本身。这应该会有所帮助。
编辑:
要解决“未找到符号”错误,您需要将测试依赖项添加到 Maven POM。这将是 JUnit 和 Spring Test 模块,两者都带有 <scope>test</scope> .此外,如果您使用像 Mockito 这样的模拟框架,您还需要将该依赖项(带有测试范围)添加到您的 POM 中。尝试一下,然后报告发生的情况。
关于xml - 如何为 Spring 测试创建 TestContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2862888/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere