如何在公共方法中测试局部变量,返回void类型?

时间:2017-05-02 10:41:11

标签: java unit-testing mocking mockito powermock

我有疑问。我的CUT有一个公共的mehtode," sync()"返回void并使用一些变量,如" syncContactEnabled"它们是使用spring和属性文件设置的。 这是我的CUT:

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()"的内部方式方法,例如我如何测试" startDate" if-else条件中的值?

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

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

1 个答案:

答案 0 :(得分:3)

  

第一个问题:

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

你没有。

  

第二个问题:

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

你也不是。

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

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

  

我想,我只是可以使用一些测试:PowerMockito.donothing或PowerMockito.verify ..... yes ????我无法测试内部方式... - m.mjn202

任何机会都要避免使用 PowerMock(-ito)。在大多数情况下, PowerMock(-ito)的需求是设计糟糕和缺乏依赖注入的标志。

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

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