代码单元测试四
2022-04-20 本文已影响0人
supremecsp
如何对private方法写单元测试?
有时public方法返回值是void,对该方法写测试无法进行断言。可以对方法内的部分逻辑进行封装再测试。
1,可以通过反射测试private方法
@Test
public void test() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
App app = new App();
Method privateMethod = app.getClass().getDeclaredMethod("callPrivateMethod");
privateMethod.setAccessible(true);
Assert.assertEquals("Private method is called.", privateMethod.invoke(app));
}
2,加上@VisibleForTesting注解,将方法改为protected;(个人用这个)
如何mock返回值为void的方法?
在Mockito中,我们可以使用不同的方法来调用实数方法或模拟void方法。 我们可以根据要求使用其中一个选项
doNothing() :完全忽略对void方法的调用,这是默认行为
doAnswer() :在调用void方法时执行一些运行时或复杂的操作
doThrow() :调用模拟的void方法时引发异常
doCallRealMethod() :不要模拟并调用真实方法
1,doNothing()
如果我们只想完全忽略void方法调用,则可以使用doNothing()。
例:用于下发信息 doNothing().when(devGroupSyncProducer).sendMessage(any());
2,doAnswer()可以对参数进行一些特殊处理
例:入参传入一个集合,方法对集合进行过滤,返回void
doAnswer((InvocationOnMock invocation)->{
List dids = (List) invocation.getArguments()[0];
dids.remove(dids.size()-1);
return null;
}).when(familyServer).filterSubDidOtherFamily(any());