public class A {
public void method(boolean b){
if (b == true)
method1();
else
method2();
}
private void method1() {}
private void method2() {}
}
public class TestA {
@Test
public void testMethod() {
A a = mock(A.class);
a.method(true);
//how to test like verify(a).method1();
}
}
如何测试私有方法是否被调用,以及如何使用mockito测试私有方法???
10 回答
你不能用Mockito做到这一点,但你可以使用Powermock来扩展Mockito并模拟私有方法 . Powermock支持Mockito . Here就是一个例子 .
不可能通过mockito . 从他们的wiki
这是一个小例子如何用powermock做
要测试 method1 使用代码:
设置私有对象 obj 使用此:
从行为的角度考虑这个问题,而不是考虑采用何种方法 . 如果
b
为true,则称为method
的方法具有特定行为 . 如果b
为false,则它具有不同的行为 . 这意味着您应该为method
编写两个不同的测试;每个案例一个 . 因此,不是有三个面向方法的测试(一个用于method
,一个用于method1
,一个用于method2
,而是有两个面向行为的测试 .与此相关(我最近在另一个SO线程中提出了这个问题,并且结果被称为四个字母的单词,所以请随意拿出一些盐);我发现选择反映我调用你的测试
testMethod()
,testMethod1()
,testMethod2()
等行为的测试名称会很有帮助 . 我喜欢像calculatedPriceIsBasePricePlusTax()
或taxIsExcludedWhenExcludeIsTrue()
这样的名字来表明我正在测试的行为;然后在每个测试方法中,仅测试指示的行为 . 大多数此类行为仅涉及对公共方法的一次调用,但可能涉及对私有方法的多次调用 .希望这可以帮助 .
你不应该测试私有方法 . 只需要测试非私有方法,因为这些方法应该调用私有方法 . 如果您“想”测试私有方法,则可能表明您需要重新考虑您的设计:
我使用适当的依赖注入吗?我是否可能需要将私有方法移动到单独的类中而是测试它?这些方法必须是私有的吗? ......他们不能默认或受保护吗?
在上面的例子中,被称为“随机”的两个方法实际上可能需要放在他们自己的类中,测试然后注入上面的类 .
我能够使用反射使用mockito测试一个私有方法 . 这是一个例子,试图将它命名为有意义
我真的不明白你需要测试私有方法 . 根本问题是您的公共方法作为返回类型具有void,因此您无法测试您的公共方法 . 因此,您被迫测试您的私人方法 . 我猜是正确的吗?
一些可能的解决方案(AFAIK):
嘲笑你的私人方法,但你仍然不会“实际”测试你的方法 .
验证方法中使用的对象的状态 . MOSTLY方法要么对输入值进行一些处理并返回输出,要么改变对象的状态 . 也可以使用测试对象的所需状态 .
SomeClass classObj = null;
public void publicMethod(){
privateMethod();
}
private void privateMethod(){
classObj = new SomeClass();
}
}
[在这里,您可以通过检查classObj从null到非null的状态更改来测试私有方法 .
码 .
将您的测试放在同一个包中,但是使用不同的源文件夹(src / main / java与src / test / java)并将这些方法设置为package-private . Imo可测试性比隐私更重要 .
虽然Mockito不提供该功能,但您可以使用Mockito JUnit ReflectionUtils类或Spring ReflectionTestUtils类来实现相同的结果 . 请参阅以下从here获取的示例,解释如何调用私有方法:
ReflectionTestUtils和Mockito的完整示例可以在书中找到Mockito for Spring
实际上有一种方法可以测试私人会员与Mockito的方法 . 假设你有一个这样的类:
如果你想测试
a.method
将从SomeOtherClass
调用一个方法,你可以写下面的内容 .ReflectionTestUtils.setField();
会将私人成员与您可以侦察的内容存根 .