Java 使用Junit测试Spring单例实现

Java 使用Junit测试Spring单例实现,java,spring,junit,singleton,Java,Spring,Junit,Singleton,我们在代码中遇到了一个问题,这是由于一个bean实现为单例,但不是无状态的。因此,当同时触发多个请求(web服务)时,会出现异常,并且不会返回正确的响应 这可能是使用Junit捕获的吗?如果是这样,我们如何使用Junit实现同样的功能?如果没有,还有其他选择吗?您可以将线程与JUnit一起使用,只需启动几个后台线程来并发调用服务,然后在主线程上调用服务,看看测试是否通过。就我个人而言,我使用这种方法来测试(乐观/悲观)锁定。然而,我要说的是,在确定大多数并发性问题时,这并不是一种特别可靠的方法

我们在代码中遇到了一个问题,这是由于一个bean实现为单例,但不是无状态的。因此,当同时触发多个请求(web服务)时,会出现异常,并且不会返回正确的响应


这可能是使用Junit捕获的吗?如果是这样,我们如何使用Junit实现同样的功能?如果没有,还有其他选择吗?

您可以将线程与JUnit一起使用,只需启动几个后台线程来并发调用服务,然后在主线程上调用服务,看看测试是否通过。就我个人而言,我使用这种方法来测试(乐观/悲观)锁定。然而,我要说的是,在确定大多数并发性问题时,这并不是一种特别可靠的方法

更好的替代方法是使用负载测试工具,如SoapUI或JMeter,并使用多个并发使用者调用web服务,最好是更长时间,然后查看这是否会产生错误

在这两种情况下,您都必须计划这些类型的测试,即预测并发性问题


编辑:代码审查(由具有良好并发经验的人员进行)也是捕获并发问题的非常有效的方法。静态代码分析在特定情况下也可能有所帮助,但我不会单独打赌。

一旦怀疑问题,junit可以用来证明问题是真实的,但它不适合强制执行此处违反的最佳实践

“单身人士不应该有州。”

这句话在编码标准文档中更为常见,可能是通过静态代码分析工具实现的

试图通过抛出线程来证明某些东西不存在任何并发性问题几乎是不可能的。如果你做到了,并且你很幸运,你可能会证明它确实有问题。你永远无法证明它不是

最好了解并遵循最佳实践,并让其他人查看您的代码


事实上,我不是100%确定单身人士永远不应该有状态。但是,当它们被执行时,它们最好是同步的或不可变的,如果它们被跨线程共享的话。如果不是为什么,请解释我是新手。@pathfinder2104是的,它应该是原型,因为bean将保持状态。但问题是,使用JUnit是否可以在开发阶段发现这个问题。答案是:这取决于您应用于项目的集成测试的类型。@LuiggiMendoza Thanx解释…:)我也在寻找实际的答案,因为它可能对我未来的发展有所帮助:)@pathfinder2104没有具体的答案。您可以为您的组件设计最好的测试用例,但总有一个您甚至想象不到它可能存在的用例,而这个特定的用例出现在生产环境中,并破坏了您的所有工作=\。您只能通过使用单元测试和集成测试覆盖您的组件来防止大多数情况发生。这就是为什么我在第一次评论中说:也许吧。