如何在java中单元测试同步方法?

时间:2013-09-17 00:07:05

标签: java multithreading unit-testing mocking synchronized

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

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

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

谢谢,
婴儿床

1 个答案:

答案 0 :(得分: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);
 }

虽然这可以像任何外部机制一样做得很好,但它实际上永远无法保证对同步方法进行多次调用,并且在没有可能破坏应用程序时间的工具的情况下正确地执行它。

虽然良好的单元测试覆盖率只是总是是一件好事,但是对于线程编程更有用的是恕我直言,这是另一个知识渊博的方法和方法周围的互斥和数据共享的良好结对编程审查显影剂。