小编shu*_*tsy的帖子

如何注入相同接口的多个模拟

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并设置旧的方式?

java spring dependency-injection mocking mockito

19
推荐指数
3
解决办法
2万
查看次数

ActiveMQ:“通道不活动太久”异常停止代理消息传递

我的系统有以下几个部分:

  • ActiveMQ 代理暴露在 tcp 端口 61616 上
  • 3 Grails/Spring 战争存在于它们自己的 Tomcat 服务器中,它们向 JMS 代理发布和使用消息
  • n 次远程客户端系统,带有 JMS 侦听器组件以接收客户端特定消息,使用主机名和端口 61616 通过 VPN 连接到 JMS 代理

到目前为止,在开发、测试和生产环境中一切正常。

我们刚刚在生产中连接了一个新的客户端系统,我们注意到它的日志开始报告“通道不活动太久”异常并断开连接。担心这个客户端的整体影响是它停止了代理上的所有消息消耗,从而使整个系统停止。

此客户端侦听器(使用 Spring 缓存连接工厂)似乎可以正常连接到 JMS 代理,处理一些消息,然后 3 分钟报告异常。在 ActiveMQ 中打开 DEBUG 并获得大量输出,但没有任何迹象表明同时在代理上出现警告或错误。

相信 ActiveMQ 有一些内部保持活动,即使不活动时间超过默认 30 秒,也应该保持连接。

基础设施人员已经监控了这个客户端的 VPN,并确认它一直保持连接状态。

不要相信代码或 Spring 配置有问题,因为我们在不同的客户端中有许多其他的侦听器实例,并且它们的行为都很好。

假设我真的有两个问题:

  1. 是什么导致“通道不活动”异常?
  2. 为什么单个客户端中的此异常会阻止 ActiveMQ 工作?

编辑 - 添加异常堆栈跟踪:

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)

java activemq-classic jms

7
推荐指数
1
解决办法
2万
查看次数

jetty:如何声明 JVM 范围的 jndi 条目并绑定到 java:comp/env

我正在尝试在 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)

java jndi jetty

5
推荐指数
1
解决办法
2444
查看次数

Jenkins在bash shell脚本中添加单引号

我的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服务器上执行。创建了新的工作,可以是自由样式,也可以通过复制现有的工作来工作,但是没有什么区别。

linux bash shell jenkins

5
推荐指数
1
解决办法
3926
查看次数

Grails/groovy测试 - assert和assertEquals方法之间的任何区别

我有许多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)

这两种方法之间有什么区别吗?

java grails groovy junit

4
推荐指数
1
解决办法
3477
查看次数

将Maven用于非Java项目(覆盖清理/编译/安装目标)

我对使用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'目标以发布目标目录中的所有文件,但作为单个人工制品?

任何帮助/指导表示赞赏.

java ant maven

3
推荐指数
1
解决办法
3742
查看次数