56089


お世話になっています。PowerMockito.Nothingの振る舞いについて教えてください。  
今回テスト対象に、環境依存でどうしても実行できないprivateメソッドが存在するため、  
該当の処理をPowermockitoで無効化したいと考えています。簡単なサンプルで示すと  
以下の通りです。

[code]

    package com.foo.var;
    
    public class Target {
    
        public void method1() {
            this.method2("サンプル","サンプル");
        }
    
        private void method2(String arg, String arg2) {
            System.out.println("よばれてしまいましたよ。");
            //ここが一度も実行されあいようにしたいのです。
        }
    
    }
    
    
[/code]

このクラスをテストするテストクラスを作成します。  
事情があってmethod2は実行させたくありません。

[code]

    @RunWith(PowerMockRunner.class)
    public class TargetTest {
    
        @Test
        public void testMethod1() throws Exception {
            Target target = PowerMockito.spy(new Target());
            PowerMockito.doNothing().when(target,"method2",Matchers.anyString(),Matchers.anyString());//★1
            //この段階でmethod2が呼ばれてしまいます。
    
            target.method1();//★2
            //target.method1();
    
        }
    }
    
[/code]

この時、実行結果は以下の通りです。

[code]

    【標準出力】
    よばれてしまいましたよ。
    
    【標準エラー出力】
    org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
    Invalid use of argument matchers!
    0 matchers expected, 2 recorded:
    -> at com.foo.var.TargetTest.testMethod1(TargetTest.java:35)
    -> at com.foo.var.TargetTest.testMethod1(TargetTest.java:35)
    
    This exception may occur if matchers are combined with raw values:
        //incorrect:
        someMethod(anyObject(), "raw String");
    When using matchers, all arguments have to be provided by matchers.
    …以下略
    
    例外は、target.method1()実行時に出力されています。
    
    
[/code]

なにか根本的に間違えているかもしれませんが以下に回答いただけたら幸いです。

1: ★1実行時に、モック対象のメソッドが呼ばれてしまいますが、抑止することはできないでしょうか。  
2: ★2実行時にどうやら、片方の引数が「値を特定して」よばれているように検知されています。この理由を知りたいです。  
⇒バグであればうれしいのですが。  
3: そもそも、やりたいことと方法がマッチしていないなどのご指摘があればうれしいです。

お手数ですが、回答宜しくお願いします。


CC BY-SA 4.0
2019-06-13T12:36:14.593
55759
2019-06-25T09:41:50.890
10174
question
java
PowermokitoでのdoNothingの動作について。


以下のようにPrepareForTestアノテーションを使用することで  
モック対象のメソッドの呼び出し抑止と引数の問題解決しないでしょうか。

[code]

    @RunWith(PowerMockRunner.class)
    @PrepareForTest({ Target.class })
    public class TargetTest {
    ...
    
[/code]


CC BY-SA 4.0
2019-06-25T09:34:38.360
56089
2019-06-25T09:41:50.890
2019-06-25T09:41:50.890
19110
34858
55759
answer