zoukankan      html  css  js  c++  java
  • Java多线程单元测试

    今天测试的时候碰到一个多线程测试的问题。

    问题描述:class(ChildThread)继承Thread,方法run是一个循环,循环的break条件是在方法childThreadStop中判断。

    public class ChildThread extends Thread{
    
      ...
    
      private boolean alive_flag;
    
      public void run(){
    
        alive_flag = true;
    
        While(alive_flag){
    
          ...
    
        }
    
      public void childThreadStop(){
    
        alive_flag = false:
    
      }
    
    }

    由于方法run中有一些其他的class,需要Mock掉,但是在PowerMock中不能新建一个Thread来使用Thread.start()。所以必须另想方法。

    在网上找了下,上面说有一个多线程测试"Unit Test for Multi-Thread",但是路径一直不对。不知道什么原因。

    后来又找了个"GroboUtils",这个是可以的,而且也很简单。

        @Test
        public void testrun() throws Throwable{
            //略......
                    //注意:由于是使用两个线程使用同一个对象,所以Mock的方法需要使用PowerMock.expectLastCall().atLeastOnce();
            ChildThread mockChildThread = PowerMock.createPartialMock( ChildThread.class, ..... );
            
            PowerMock.replayAll();
            TestRunnable tr = new TransferThread( mockChildThread );
            TestRunnable tr2 = new TransferThread2( mockChildThread );
            
            TestRunnable[] trs = { tr, tr2 }; 
            MultiThreadedTestRunner mttr = new MultiThreadedTestRunner(trs); 
            mttr.runTestRunnables();
            PowerMock.verifyAll();
            
        }
        //第一个线程启动测试方法run
        private static class TransferThread extends TestRunnable{
            private ChildThread childThread;
            public TransferThread(ChildThread childThread){
                super();
                this.childThread = childThread;
            }
            @Override
            public void runTest() throws Throwable {
                childThread.run();
            }
            
        }
        //第二个线程sleep一段时间后,关闭Thread
        private static class TransferThread2 extends TestRunnable{
            private ChildThread childThread;
            public TransferThread2(ChildThread childThread){
                super();
                this.childThread = childThread;
            }
            @Override
            public void runTest() throws Throwable {
                Thread.sleep( 100 );
                childThread.childThreadStop();
            }
            
        }
        

    完成!

  • 相关阅读:
    leetcode Lowest Common Ancestor of a Binary Tree
    leetcode 141、Linked list cycle
    leetcode 136、Single Number
    tensorflow使用
    c++ priority_queue
    python语法
    CSS基础之选择器
    并发编程的一些理解
    封装的绑定与多态
    继承与派生
  • 原文地址:https://www.cnblogs.com/charlexu/p/2856643.html
Copyright © 2011-2022 走看看