Java 如何验证构造函数中调用的私有方法?

Java 如何验证构造函数中调用的私有方法?,java,unit-testing,Java,Unit Testing,我有一些类似的代码,我想验证名为“find”的方法: 我考虑过PowerMock并编写了一些代码: @RunWith(PowerMockRunner.class) @PrepareForTest(fullyQualifiedNames = "com.mypackage.*") public class HandlerTest { private final String[] input = new String[]{"valid"}; @T

我有一些类似的代码,我想验证名为“find”的方法:

我考虑过PowerMock并编写了一些代码:

@RunWith(PowerMockRunner.class)
@PrepareForTest(fullyQualifiedNames = "com.mypackage.*")
public class HandlerTest {
    private final String[] input = new String[]{"valid"};
    @Test
    public void shouldFindValidCommands() throws Exception {
        Handler handlerSpy = PowerMockito.spy(new Handler(input));
        doReturn(true).when(handlerSpy, "find", ArgumentMatchers.any(String[].class));
        Whitebox.invokeMethod(handlerSpy, "find");
        verifyPrivate(handlerSpy).invoke("find", input);
    }
但它给了我一个错误:

No method found with name 'find' with parameter types: [ <none> ] in class com.mypackage.handler.Handler$MockitoMock$1535580467.
在com.mypackage.handler.handler$MockitoMock$1535580467类中未找到名为“find”且参数类型为[]的方法。

我不知道如何验证是否调用了我的私有方法。

我猜您基本上想做的是:

   var command = find(args);
   if (!command ) { /* do stuff */}
find函数不需要测试来检查它是否被调用,因为当
args
null
args
length
0时,它不处理类中的任何内容,而是总是返回
true
false
或抛出
RuntimeException

除非您使用隐式无参数构造函数,否则在构造
处理程序的新
对象
时无法调用此函数(JVM终止除外)。但为了避免这种情况,只需添加一个私有构造函数:

private Handler()
{}
对于您的测试:您希望测试阳性案例,大致如下所示:

@Test
public void shouldFindValidCommands() {
final String[] validInput = {"valid"};
Handler handler = new Handler(validInput);
}
对于阴性测试:

@Test(expected = IllegalArgumentException.class)
public void shouldThrowIllegalArgumentException() {
final String[] invalidInput = {"invalid"};
Handler handler = new Handler(invalidInput);
}

只要我知道它不是一个新的Java特性,
find
没有返回类型,并且从不返回
null
,因此命令永远不能是
null
。另外,
String
类不包含名为
equal
的方法。你甚至不应该在这里开玩笑。你的方法是完全可测试的,没有模拟,只要你坚持它实际可以返回的值…对不起,我的不好,我只想为我的实际情况写一个简单的代码^^。我已经修好了it@maio290我仍然不明白当它是私有方法(不能在测试方法中调用)私有意味着私有时,它如何返回值。不要检查私有方法。检查最终行为,无论是使用私有方法还是使用内联代码;在这种情况下,通过传递
valid
和不传递
valid
并确认命令正在/未运行。哦,我可以看到,谢谢,我非常感谢。
@Test(expected = IllegalArgumentException.class)
public void shouldThrowIllegalArgumentException() {
final String[] invalidInput = {"invalid"};
Handler handler = new Handler(invalidInput);
}