2016-08-05 25 views
1

私はこの質問を少し調べて、私が必要とするものを見つけられませんでした。私はJMockitと嘲笑についてもう少し学んだ。どっちがいい。誰もが何かが実行されたことを確認する方法を知りたいと思うようです。私はその反対を学びたいと思います。プライベートメソッドが実行されていないことを確認してください。JMockit

オクラホマ - パブリックメソッドであまりうれしくないパスを確認するテストを作成しています。テストされているメソッドはvoidですので、実際にはassertの結果を得ることはできません。 私がしたいのは、メソッドがこのテストケースで実行されなかったことを確認することです。例えば

:私はテストケースの結果として取得しています何

class ClassToTest { 
    private void method(String arg){} 

    public void publicMethod(String arg0, String arg1){ 
    if(false){ 
     //this method should never get called. 
     method(arg0); 
    } 
    } 
} 

class TestingClass{ 
    @Tested 
    private ClassToTest classToTest = new ClassToTest(); 

    @Test 
    public void testCheckingIfPrivateMethodWasCalled(){ 
    classToTest.publicMethod("string1", "string2"); 

    new Verifications() { 
     { 
     //At this point I am trying something like 
     Deencapsulation.invoke(classToTest, "method", "string1"); 
     times = 0; //Also tried maxTimes = 0; 
     //Through debug it looks like the invoke is doing what it's named... 
     //invoking the private method, I don't want to invoke. 
     //How do I check that ClassToTest#method was not called? 
     } 
    } 
    } 
} 

java.lang.IllegalStateException: Missing invocation to mocked type at this point; please make sure such invocations appear only after the declaration of a suitable mock field or parameterです。 times = 0;の行にあります。

私はinvokeがプライベートメソッドを実行していることを知っています。私は、メソッドを呼び出す/実行することなくメソッドが呼び出されたことを「チェック」する方法を見つけ出そうと、頭を悩ませています。

ありがとうございました。 fakingのためのモックアップAPIでそれをやっているの

+2

テストアプリケーションの状態。あなたのプライベートメソッドの呼び出しが重要な場合、それはどこかで影響を受けた状態になっているはずです。テストすることができるはずです。それを回避するには、テストで検証できるように、メソッドのデフォルトの可視性(パッケージ保護とも呼ばれます)を与えることを検討してください。 (あなたのテストは、あなたがテストしているクラスと同じパッケージになっていると仮定しています。これは合理的な仮定です) – nasukkin

+0

*決して 'プライベート'メソッドをモックしないでください。考えてみましょう:プライベートメソッドは、品質を気にする開発者がいつでも作成またはインライン化できます。機能を保持したリファクタリングを通じて生産コードを改善しながら、実際に作業テストを修正する必要がありますか?気にしなくても、チーム内の他の開発者や今後の開発者を考慮してください。 –

答えて

0

一つの方法:

import static org.junit.Assert.assertFalse; 

import org.junit.Test; 

import mockit.Mock; 
import mockit.MockUp; 
import mockit.Tested; 

public class TestingClass { 

    @Tested 
    private ClassToTest classToTest = new ClassToTest(); 

    @Test 
    public void testCheckingIfPrivateMethodWasCalled() { 
     PrivateMethodCheckMockUp mockUp = new PrivateMethodCheckMockUp() { 
      @Mock 
      private void method(String arg) { 
       calledPrivate = true; 
      } 
     }; 

     classToTest.publicMethod("string1", "string2"); 

     assertFalse(mockUp.calledPrivate); 
    } 

    class PrivateMethodCheckMockUp extends MockUp<ClassToTest> { 
     boolean calledPrivate = false; 

     @Mock 
     private void method(String arg) { 
      calledPrivate = true; 
     } 
    } 
} 
+0

クラスのインスタンスを嘲笑して、そのクラスのメソッドを嘲笑していますか?あなたは 'PrivateMethodCheckMockUp#method'を何回モックしますか? –

+0

実際には、 'ClassToTest'は一度だけ嘲笑されます。' @ Tested'は模擬を作成しません。 "JMockitは自動的にこのクラスをインスタンス化し、必要に応じて関連した擬似依存関係を注入することによって助けます。 – Alfergon

+0

それから、私は 'MockUp' APIを使ってプライベートメソッドを模擬し、それが呼び出されたかどうかを知るためにフラグを使います(おそらく' Assert.fail() 'で十分でしょう)。 – Alfergon

関連する問題