PowerMock與EasyMock的應用


  Leader要求在做Junit測試的時候,Mock掉各個方法之間的依賴。這兩天學習了下PowerMock的使用。

  PowerMock是EasyMock的一個擴展,加入了static,final,private,以及constructor的Mock功能。但是PowerMock並沒有繼承EasyMock的一些測試功能,所以不能取代EasyMock,而單獨使用。在很多時候必須要PowerMock和EasyMock相互結合,以及加上WhiteBox,才能更好實現測試。

  1. 必不可少的一步:添加測試運行器@RunWith(PowerMockRunner.class),如果沒有添加這個運行器,則使用的是默認的JUnit4.class。在PrepareForTest中加入測試class。@PrepareForTest(測試.class)

  2. Construtor

    public class A{
        public void doA(){
          B.doB();
          }
      }

    public class B{
       public B(){
           System.out.println("can't be here!");
        }
    }
       

    測試classA中的doA方法:

  @RunWith(PowerMockRunner.class)
  @PrepareForTest({A.class})
  public class ATest {

      @Test
      public void testdoA() throws Exception {
          B mockB = PowerMock.createMock( B.class );
          PowerMock.expectNew( B.class ).andReturn(mockB);
          A testA = new A();
          PowerMock.replayAll();
          testA.doA();
          PowerMock.verifyAll();
      }

  }

 

   3.static

    測試static方法的時候必須要加上@PrepareForTest(靜態方法.class),否則就會拋出java.lang.IllegalStateException: no last call on a mock available異常。如果有多個class,用{},例如@PrepareForTest({A.class,B.class})

    public class A{
        public void doA(){
          B.doB();
        }
    }

    public class B{
        public static String doB() {
          return ("can't be here !");
        }
    }

 

    測試classA中的doA方法:

    @RunWith(PowerMockRunner.class)
    @PrepareForTest({A.class, B.class})
    public class ATest {
        @Test
        public void testdoA() throws Exception {
            PowerMock.mockStatic( B.class );
            EasyMock.expect(B.doB()).andReturn("Mocked !");
            A testA = new A();
            PowerMock.replayAll();
            assertEquals("Mock not complete !", testA.doA(), "Mocked !");
            PowerMock.verifyAll();
        }
    }

   4.mock類中的Field

    一個好的Field應該有getter和setter,但是代碼中沒有,我們也可以用WhiteBox來Mock掉Field。

    public class A{
        private String C;

        public A(){
            C = "Can't be here !";
        }
    
        public String doA(){
            return C;
        }
    
    }

    測試A中的doA方法

    @RunWith(PowerMockRunner.class)
    @PrepareForTest({A.class, B.class})
    public class ATest {

        @Test
        public void testdoA(){
            A testA = new A();
            String mockC = "Mocked !";
            Whitebox.setInternalState( testA, "C", mockC );
            assertEquals("Mock not complete !", testA.doA(), "Mocked !");
        }

    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM