UTとPowerMock

4044 ワード

PowerMockの概要


テストする方法は、外部依存オブジェクト(接続getConnection、getAdminを取得)を多く参照し、外部オブジェクトは制御できず、シミュレーション(mock)外部オブジェクトは制御可能になります.

核心思想.


あなたがmockを必要とする方法はあなたのmockの対象調でなければなりません.元のオブジェクトは元の論理しか歩けない.

注釈が必要な場合:

@RunWith(PowerMockRunner.class)
@PrepareForTest ( { YourClassWithEgStaticMethod.class })
  • PowerMockito.whenNewメソッドの場合、注記@PrepareForTestに書かれているクラスは、mockを必要とするnewオブジェクトコードが存在するクラス
  • です.
  • 一般オブジェクトのfinilメソッド、注記にfilalメソッドが存在するクラス
  • を書く
  • 一般オブジェクトのstaticメソッド、注釈にstaticメソッドが存在するクラス
  • を書く
    PowerMockito.mockStatic(ClassDependency.class);
    PowerMockito.when(ClassDependency.isExist()).thenReturn(true);
    
  • privateメソッド、注記privateメソッドのクラス
  • PowerMockito.when(other.pub(Mockito.anyString())).thenCallRealMethod();
    PowerMockito.when(other, "pri", Mockito.anyString()).thenReturn(" $$ I am handsome %% private.");
    
  • システムクラスの静的およびfinalメソッド、注釈に書かれたクラスは、システムメソッドを呼び出す必要があるクラス
  • である.

    その他

  • Voidメソッド注釈なしbut:
  • PowerMockito.doNothing().when(mockUnder.dovoid(Mockito.anyString()));   //WRONG
    PowerMockito.doNothing().when(mockUnder).dovoid(Mockito.anyString());   //RIGHT
    PowerMockito.doNothing().when(mockUnder,"dovoid","aa","bb");   //RIGHT
    PowerMockito.when(mockUnder,"dovoid","aa","bb").thenAnswer(answer);   //RIGHT
    

    以下の書き方をお勧めします.
    PowerMockito.doNothing().when(mockUnder,"dovoid","aa","bb");
    PowerMockito.doNothing().when(UnderTest.class,"dovoid","aa","bb");
    PowerMockito.when(mockUnder,"dovoid","aa","bb").thenAnswer(answer);
    PowerMockito.when(under1, "isDpa", Mockito.anyString()).thenReturn(true);
    
  • SpyクラスCのm 1メソッドがm 2を落とし、クラスCのm 1をカバーしたい場合は、シミュレーション杭m 2はspy
  • を用いることが考えられる.
  • Answer Object[] args = invocation.getArguments();入力パラメータに注意し、境界
  • を越えないでください.
  • は、第1回true、第2回false PowerMockito.when(under1.isDpa(Mockito.anyString())).thenReturn(true).thenReturn(false);
  • など、複数回の戻り結果が異なることを望む.
  • Mock投げ異常PowerMockito.doThrow(new NullPointerException()).when(other).doExcep(Mockito.anyString());投げの異常はmockの方法で投げられるものでなければならない.そうしないとmockは異常を投げてしまうので、試験例の大きなcatchにAssertと書かないでください.assertTrue(true);プログラム投げ異常を判断するには、この異常はmockの時に投げた可能性が高いからです.
  •     @Test
        public void test() 
        {
            try
            {
                // do some test
            }
            catch (Exception e)
            {
                e.printStackTrace();
                Assert.assertTrue(false);
            }
        }
    
  • 反射
  • UnderTest under = new UnderTest();
    StudentMgr stuMgr = PowerMockito.mock(StudentMgr.class);
    Class clazz = AbstractClass.class;
    Field field = clazz.getDeclaredField("studentMgr");
    field.setAccessible(true);
    field.set(under, stuMgr);
    

    よくある質問

  • InitializationError@Test注記jarパッケージJunitバージョンが欠けていません(junitは4.12では使用できません)
  • spy() vs mock()

  • spy() is used when you want the real code of the class you are spying on to do its job, but be able to intercept method calls and return values. mock() is used to make a new class that has the same interface as the class you are mocking, but with NO code inside...

    注意事項

  • UTクリーンアップ環境終了
  •     @BeforeClass        // class 
        public static void setUpBeforeClass() throws Exception
        {
        }
        @AfterClass     // class 
        public static void tearDownAfterClass() throws Exception
        {
        }
        @Before     // Test 
        public void setUp() throws Exception
        {
        }
        @After      // Test 
        public void tearDown() throws Exception
        {
        }
    
  • setuUp()のmockのものは各Test注意:
  • に影響します.
    mock singleton static final : mock before other code new it. mock単例は他のコードnewの前に
  • テストの目的はコードの欠陥を発見し、問題を発見し、直ちに開発と確認し、カバー率のためにテストを書かないでください.全プロセスできるだけ全プロセス