読者です 読者をやめる 読者になる 読者になる

JMockitでprivateメソッドをモック化したいのにIllegalArgumentException: Invalid null value passed as argument って言われるんです

new NonStrictExpectations(Target.class) {{
    invoke(Target.class, "method", any);
}};

こう書いていたわけです。するとjava.lang.IllegalArgumentException: Invalid null value passed as argument 0って言われるんです。invoke(Target.class, "othermethod", anyString)だと問題ないのに。

JMockit初めて使うしノリがまだ分からないし、その場は諦めてしまった。

理由は単純で、このinvokeはnullでない引数しか受けられないのにanyはnullだから起こっているわけですね。

class Target {
    public static void main() {
        private1("1");
        private2(new StringBuffer("2"));
    }

    private static void private1(String string) {
        throw new RuntimeException();
    }

    private static void private2(StringBuffer string) {
        throw new RuntimeException();
    }
}

public class JMockitSample {
    @Test
    public void 対象メソッドのみテスト1() {
        new NonStrictExpectations(Target.class) {{ // partial mockにしないとテスト対象すらモック化されてしまう
            invoke(Target.class, "private1", anyString);
            invoke(Target.class, "private2", new Class<?>[]{StringBuffer.class}, any); // anyはnullのためパラメータの型を指定しなければならない
        }
        };

        Target.main();
    }
    @Test
    public void 対象メソッドのみテスト2(
            // privateメソッドはどうせ静的にメソッド名を指定するしかないからこっちの方が楽
            @Mocked("private\\d") Target subject
            ) {
        Target.main();
    }
}