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(); } }