代码单元测试四

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

参考:使用Mockito的Mock Void方法如何单元测试Java的private方法

上一篇 下一篇

猜你喜欢

热点阅读