【问题标题】:How to unit test a synchronous method in java?如何在java中对同步方法进行单元测试?
【发布时间】:2013-09-17 00:07:05
【问题描述】:

我很想知道如何在 Java 中对同步方法进行单元测试。我们可以使用像 jMockit、Mockito 这样的模拟框架吗?

我正在寻找类似于以下有趣帖子的答案:http://www.boards.ie/vbulletin/showthread.php?t=2056674659

不幸的是,没有提出建议/回答,而是进行了不必要的讨论!

谢谢,
婴儿床

【问题讨论】:

  • jmockit.googlecode.com/svn/trunk/www/tutorial/…
    看到这条评论:“到目前为止,我们只用公共实例模拟方法模拟公共实例方法。实际上,真实类中的任何其他类型的方法可以模拟:具有私有、受保护或“包私有”可访问性的方法、静态方法、最终方法和本机方法。(还有 synchronized 和 strictfp 方法,但这些修饰符只影响方法实现,而不影响它的接口。).. ." 我不确定他们是否意味着他们可以像其他方法一样测试同步方法

标签: java multithreading unit-testing mocking synchronized


【解决方案1】:

我很想知道如何在 Java 中对同步方法进行单元测试。

如果您的意思是如何编写单元测试来测试方法(或类)是否正确同步,这是一项很难完成的任务。您当然可以编写一个使用多个线程的测试,这些线程不断调用该方法并测试synchronized 关键字所保护的任何内容。但真正测试围绕它的保护可能并不那么简单。

 public void testPummel() {
     ExecutorService fireHose = Executors.newFixedThreadPool(100);
     final Foo sharedInstance = new Foo();
     fireHose.submit(new Runnable() {
         public void run() {
             for (int i = 0; i < 100; i++) {
                 // setup test
                 Result result = sharedInstance.synchronizedMethodToTest(...);
                 // test result
             }
         }
     });
     fireHose.shutdown();
     fireHose.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
 }

尽管这作为任何外部机制都做得很好,但它确实无法保证对同步方法进行多次调用,并且在没有会破坏应用程序计时的仪器的情况下正确执行它。

虽然良好的单元测试覆盖率总是是一件好事,但恕我直言,线程编程更有用的是对互斥体和方法内部和周围的数据共享的良好结对编程审查与另一位知识渊博的人开发者。

【讨论】:

  • 我们如何扩展它来测试不同的输入(比如不同的参数来 synchronizedMethodToTest() )?
  • 您可以传入List 的参数,每个参数都可以采用自己的参数并触发它。或者你会生成随机输入参数@user2381731。
  • 你的意思是像输入和结果的集合(input1-result1,input2-result2)然后随机访问它并断言相应的测试结果吗?
  • 我发了一个新问题:stackoverflow.com/questions/18839327/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
相关资源
最近更新 更多