我最近以自由职业者的身份开始了我当前的项目。我投入其中的一件事是失败的 Jenkins 构建(它从 4 月 8 日开始失败,也就是我开始这里的前一周)。
一般来说,您可以在日志中看到一大堆 DI 问题。我做的第一件事是让所有测试以相同的方式工作,从相同的应用程序上下文开始。 他们还实现了自己的“模拟”东西,但似乎无法正常工作。在与主要开发人员讨论后,我建议开始使用 Springockito。 (对于某个模块,他们需要模拟他们的集成测试 - 遗留原因,无法更改)
无论如何,在那之后事情开始严重失败。许多在测试中被模拟的 bean,根本就没有被模拟,或者没有被发现等等。通常,它会在加载应用程序上下文时失败,表明缺少一个或另一个 bean。
我尝试了不同的东西和不同的方法,但最后,只有我最担心的方法会起作用:将@DirtiesContext 添加到每个测试中。现在,maven 构建又开始变绿了,测试开始做他们应该做的事情。但是我每次都重新加载 Spring 上下文,这需要时间 - 这是相对的,因为上下文在大约 1 - 2 秒内加载。
这个故事的旁注是他们已经升级到 Hibernate 4,从而升级到 Spring 3.2。以前,他们使用的是旧版本的 Spring 3。当时所有测试都正常,@DirtiesContext 不是必需的。
现在,最让我担心的是,我无法立即想到对这种奇怪行为的解释。似乎 Springs 上下文很脏,只需启动一个使用 @Autowired bean 的测试即可。并非所有测试都使用 Mocks,所以不可能。 这听起来很熟悉吗?有没有人对使用(最新版本的)Spring 进行集成测试有相同的经验?
在 Stackoverflow 上,我找到了这张票:How can a test 'dirty' a spring application context? 它似乎几乎总结了我所看到的行为,但关键是我们正在 Autowiring 服务/存储库/......,并且我们在这些类上没有任何 setter 。
有什么想法吗?
谢谢!
最佳答案
要回答我自己的问题, secret 就在 Spring 版本中。我们使用的是 Spring 3.1.3,而我认为他们使用的是 Spring 3.2(他们一直在谈论 Spring 版本的最新升级)。
解释在这里,我在寻找修复它的过程中偶然发现了一篇博客文章:Spring Framework 3.2 RC1: New Testing Features
以及相关作品的复制粘贴:
The use of generic factory methods in Spring configuration is by no means specific to testing, but generic factory methods such as EasyMock.createMock(MyService.class) or Mockito.mock(MyService.class) are often used to create dynamic mocks for Spring beans in a test application context. For example, prior to Spring Framework 3.2 the following configuration could fail to autowire the OrderRepository into the OrderService. The reason is that, depending on the order in which beans are initialized in the application context, Spring would potentially infer the type of the orderRepository bean to be java.lang.Object instead of com.example.repository.OrderRepository.
那么,我是如何解决这个问题的呢?好吧,我做了以下步骤:
我能给出的唯一合理解释是上下文实际上被弄脏了,因为有一个框架 (Springockito) 从 Spring 框架接管了 Spring bean 的管理。我不知道这是否正确,但这是我能想到的最好的解释。事实上,这就是脏上下文的定义,这就是我们需要将其标记为脏的原因。
使用这个策略,我再次构建并运行,所有测试都运行正常。它并不完美,但很有效,而且始终如一。
关于java - 每次集成测试后 Spring 上下文变脏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16833063/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的: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
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel