【问题标题】:How to test local variables in a public method which returns void type?如何在返回 void 类型的公共方法中测试局部变量?
【发布时间】:2017-05-02 10:41:11
【问题描述】:

我的 CUT 有一个公共方法“sync()”,它返回 void,它使用一些变量,例如“syncContactEnabled”,它们是使用 spring 和属性文件设置的。 这是我的剪辑:

public class ContactSyncServiceImpl implements SyncService {

 public void sync() {
        long start = System.currentTimeMillis();
        logger.info("-----sync() start:{}", start);
        if (!syncContactEnabled) {      //***********first: want to test this if
            logger.info("Contact sync isn't enabled.");
            return;
        }

        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
        Date now = new Date();
        Date startDate = null;
        String contactSyncStartDateConfig = configService.get(CONTACT_SYNC_START_DATE);
        if (StringUtils.isBlank(contactSyncStartDateConfig)) {       \\**********second: I want to test startDate value in this if-else
            startDate = new Date(now.getTime() - syncStartDaysCount * 24 * 60 * 60 * 1000l);
        } else {
            try {
                startDate = formatter.parse(contactSyncStartDateConfig);
            } catch (Exception e) {
                logger.warn("There's a problem parsing date:" + e);
            }
        }


/////////It is NOT complite code of class.......(:
}

第一个问题:

  • 如何模拟一些变量,例如在属性文件中设置的“syncContactEnabled”?

第二个问题:

  • 如何测试“sync()”方法的内部方式,例如如何测试 if-else 条件下的“startDate”值?

最后,这是我的属性文件:

sync.contact.enabled=false
sync.page.size=100
sync.cron=0 30 6,18 * * ?
#*/1 * * * * *
sync.start.days.count=365

【问题讨论】:

  • syncContactEnabled 变量如何声明?
  • 为什么要测试startDate?它是无用的(你永远不会使用它的值),应该从代码中删除。
  • @talex,这段代码不是复杂代码,我在课程的继续使用它。

标签: java unit-testing mocking mockito powermock


【解决方案1】:

第一个问题:

  • 如何模拟一些变量,例如在属性文件中设置的“syncContactEnabled”?

你没有。

第二个问题:

  • 如何测试“sync()”方法的内部方式,例如如何测试 if-else 条件下的“startDate”值?

你也没有。

在进行单元测试时,您验证公共可观察行为,这意味着:返回什么结果取决于输入以及单元如何依赖关系进行通信。

变量“syncContactEnabled”是您不验证的实现细节。这是因为 in 可能会在不改变单位行为的情况下发生变化,并且您不想在这种情况下更改测试。


我想,我可以使用一些测试,例如:PowerMockito.donothing 或 PowerMockito.verify .....是的????而且我无法测试内部方式... – m.mjn202

尽量避免PowerMock(-ito)。在大多数情况下,PowerMock(-ito) 的需要是糟糕设计和缺乏依赖注入的标志。

通常你模拟依赖,你的单元与之通信的其他类。 唯一的例外是您的单元是一个抽象类

doNothing(mock).someMethod() 配置是必需的,如果你模拟了一个真实的类(而不是一个接口)并且你需要禁止调用方法(someMethod())(例如,因为它连接到一个数据库......)

【讨论】:

  • 谢谢...我想,我可以使用一些测试,例如:PowerMockito.donothing 或 PowerMockito.verify .....是的????而且我无法测试内部方式...
  • 更新了答案。
  • 再次声明:我希望我可以为不喜欢某些模拟框架投 5 票。
猜你喜欢
  • 1970-01-01
  • 2019-06-17
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
相关资源
最近更新 更多