ServiceCaller
我想测试的Java类(调用)有这个:
@Autowired @Qualifier(value="serviceA")
SomeService serviceA;
@Autowired @Qualifier(value="serviceB")
SomeService serviceB;
Run Code Online (Sandbox Code Playgroud)
(有一种doWork()
方法可以检查条件并调用A或B).
如何将每个服务的模拟注入适当的变量?
我的Junit有这个:
@InjectMocks ServiceCaller classUnderTest = new ServiceCaller();
@Mock SomeService mockServiceA;
@Mock SomeService mockServiceB;
Run Code Online (Sandbox Code Playgroud)
然而,当我运行我的测试以检查在正确条件下调用的服务A/B时,我得到空指针,因为没有注入模拟.
显然它是因为对同一个接口的多重依赖(SomeService
).有没有办法在声明模拟服务时指定限定符?或者我是否需要为依赖项设置setter并设置旧的方式?
我的系统有以下几个部分:
到目前为止,在开发、测试和生产环境中一切正常。
我们刚刚在生产中连接了一个新的客户端系统,我们注意到它的日志开始报告“通道不活动太久”异常并断开连接。担心这个客户端的整体影响是它停止了代理上的所有消息消耗,从而使整个系统停止。
此客户端侦听器(使用 Spring 缓存连接工厂)似乎可以正常连接到 JMS 代理,处理一些消息,然后 3 分钟报告异常。在 ActiveMQ 中打开 DEBUG 并获得大量输出,但没有任何迹象表明同时在代理上出现警告或错误。
相信 ActiveMQ 有一些内部保持活动,即使不活动时间超过默认 30 秒,也应该保持连接。
基础设施人员已经监控了这个客户端的 VPN,并确认它一直保持连接状态。
不要相信代码或 Spring 配置有问题,因为我们在不同的客户端中有许多其他的侦听器实例,并且它们的行为都很好。
假设我真的有两个问题:
编辑 - 添加异常堆栈跟踪:
2013-04-24 14:02:06,359 WARN - Encountered a JMSException - resetting the underlying JMS Connection (org.springframework.jms.connection.CachingConnectionFactory)
javax.jms.JMSException: Channel was inactive for too (>30000) long: jmsserver/xxx.xx.xx.xxx:61616
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49) …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Jetty 服务器中定义一些 JNDI 条目(它们将是 JVM 范围的),但它们没有按预期自动绑定到“java:comp/env”命名空间。我正在关注以下文档:http : //wiki.eclipse.org/Jetty/Feature/JNDI#Configuring_env-entries
这是我的 jetty.xml:
<Configure id="server" class="org.eclipse.jetty.server.Server">
<New class="org.eclipse.jetty.plus.jndi.EnvEntry">
<Arg></Arg>
<Arg>prop/someValue</Arg>
<Arg type="java.lang.String">hello</Arg>
<Arg type="boolean">true</Arg>
</New>
</Configure>
Run Code Online (Sandbox Code Playgroud)
正如 Jetty 示例所暗示的那样,我希望这会绑定到“java:comp/env/prop/someValue”,但是“java:comp/env”似乎根本没有被创建。
但是,对“prop/someValue”的查找确实有效。
注意 - 我没有 webapp,所以没有 WEB-INF/jetty-env.xml 和 web.xml。我刚刚启动了一个 Jetty 服务器并尝试使用所需的 JNDI 条目对其进行配置。
还尝试将我的条目显式绑定到使用“bindToENC”方法:
<Configure id="server" class="org.eclipse.jetty.server.Server">
<New class="org.eclipse.jetty.plus.jndi.EnvEntry">
<Arg></Arg>
<Arg>prop/someValue</Arg>
<Arg type="java.lang.String">hello</Arg>
<Arg type="boolean">true</Arg>
</New>
<Call name="bindToENC">
<Arg>prop/someValue</Arg>
</Call>
</Configure>
Run Code Online (Sandbox Code Playgroud)
但这会导致服务器启动失败:
2012-11-14 11:17:25,648 DEBUG - XML new class org.eclipse.jetty.plus.jndi.EnvEntry (org.eclipse.jetty.xml.XmlConfiguration)
2012-11-14 11:17:25,650 DEBUG - SAVE prop/someValue in null (jndi)
2012-11-14 11:17:25,656 DEBUG …
Run Code Online (Sandbox Code Playgroud) 我的shell脚本如下所示:
#!/bin/bash
USER=$1
sudo rm -rf /home/$USER/system/logs/*
exit 0
Run Code Online (Sandbox Code Playgroud)
它被检入到shell文件夹中的cvs中,Jenkins配置为通过具有“执行Shell”构建步骤的作业在Linux机器上执行它:
bash -ex shell/clear-logs.sh myuser
Run Code Online (Sandbox Code Playgroud)
但是Jenkins将整个sudo行用单引号引起来,这导致我的日志文件没有被删除(尽管Jenkins作业成功通过):
[workspace] $ /bin/sh -xe /tmp/hudson7785398405733321556.sh
+ bash -ex shell/clear-logs.sh myuser
+ USER=myuser
+ sudo rm -rf '/home/myuser/system/logs/*'
+ exit 0
Run Code Online (Sandbox Code Playgroud)
有什么想法让詹金斯这么做吗?如果我以root用户身份从Jenkins工作区位置调用脚本,那么它将正常工作。
编辑:
我在不同的cvs模块中有相同的shell脚本,由詹金斯在同一台Linux服务器上执行。创建了新的工作,可以是自由样式,也可以通过复制现有的工作来工作,但是没有什么区别。
我有许多Grails单元和集成groovy测试类.
最初我使用了诸如assertEquals,assertNull,assertTrue,assertFalse等方法.
assertEquals 0, User.list().size()
Run Code Online (Sandbox Code Playgroud)
但最近我更喜欢使用直接断言:
assert User.list().size() == 0
Run Code Online (Sandbox Code Playgroud)
这两种方法之间有什么区别吗?
我对使用Maven for Java/WebApp项目有一个很好的(ish)理解,但仅限于遵循默认目标/生命周期.
但是我现在有一个备份项目,它根本不是Java项目.我正在考虑使用Maven配置它以保持一定的一致性,但我不确定如何覆盖我的定制处理的主要Maven目标/阶段.
备份项目需要执行以下操作:'build' - 最初,备份输出将是一个mysql数据库转储文件和从现有WebApp导出的zip.但我希望它具有灵活性,因此调用ant文件来完成实际工作(创建转储,调用WebApp或将来做任何事情)似乎是明智的.然后可以将输出文件复制到目标目录中.
'install' - 将输出文件发布到本地存储库,最好提供datetimestamp版本号,而不是通常的1.0.0-SNAPSHOT版本.我想Maven可以处理一个文件集合,而不是一个罐子/战争,但对此不确定.
我的pom.xml声明包装为'pom'为'jar',而'war'在这里似乎不合适.
然后,我希望其他项目能够依赖此备份项目,以便在需要时可以获得最新的备份工件.
1)如何覆盖maven'compile'目标来调用ant构建文件?
2)如何覆盖maven'install'目标以发布目标目录中的所有文件,但作为单个人工制品?
任何帮助/指导表示赞赏.