Jmockit示例三部曲的前奏

直接开门见山,用实例来学习最好不过了,先看下面这段官网示例product code,包括1个public方法和2个private方法,而且是一个方法invoke另一个方法,多么常见的代码~

package jmockit.tutorial.domain;

import java.math.*;
import java.util.*;
import org.apache.commons.mail.*;
import static jmockit.tutorial.persistence.Database.*;

public final class MyBusinessService
{
   public void doBusinessOperationXyz(EntityX data) throws EmailException
   {
      List<EntityX> items =
(1)      find("select item from EntityX item where item.someProperty = ?1", data.getSomeProperty());

      // Compute or obtain from another service a total value for the new persistent entity:
      BigDecimal total = ...
      data.setTotal(total);

(2)   persist(data);

      sendNotificationEmail(data, items);
   }

   private void sendNotificationEmail(EntityX data, List<EntityX> items) throws EmailException
   {
      Email email = new SimpleEmail();
      email.setSubject("Notification about processing of ...");
(3)   email.addTo(data.getCustomerEmail());

      // Other e-mail parameters, such as the host name of the mail server, have defaults defined
      // through external configuration.

      String message = buildNotificationMessage(items);
      email.setMsg(message);

(4)   email.send();
   }

   private String buildNotificationMessage(List<EntityX> items) { ... }
}

为了方便理解,我将Database这个类也简单粘贴出来了,Database这个类只包括了一个私有的constructor,以及几个static方法,如下

package jmockit.tutorial.persistence;

import java.util.*;
import javax.persistence.*;

public final class Database
{
   private static final ThreadLocal<EntityManager> workUnit = new ThreadLocal<EntityManager>();
   private static final EntityManagerFactory entityManagerFactory;

   static
   {
………………
  }

   private Database() {}
  
   public static <E> List<E> find(String ql, Object... args)
   {
      ………………
      return result;
   }
   public static void persist(Object data)
   {
      workUnit().persist(data);
   }
   ………………
}
因此,我们该怎么测试doBusinessOperationXyz这个方法,在不对现有产品代码做任何修改的情况下?外国人就爱这样反问激发你思考,其实这挺有效的,至少我这么认为。这里在明确一个思想,我们不能为了写单测代码而修改产品代码,比如将private方法打开,同样说来,如果一个逻辑代码块,你想了半天都不知道怎么测试,或者测试起来非常的艰难,那么就要考虑下产品代码的结构,是否需要重构了,完了,这里又抛出了2个问题,什么叫想了半天不知道怎么测试?什么叫测试的非常艰难?这个留到后续再讨论吧。

言归正传,强大的Jmockit提供了三种不同的mock API,猛的是,三种中的任意一种几乎都能解决我们所会遇到的问题,作者自己对这三种API是这么定义的:实际应用当中,前两者是一个更大behavior-oriented mocking API的子集,那第三者,我们姑且可以将它描述为state-oriented mocking API,它真的是非常与众不同。这个作者的原话,而对于behavior-oriented mocking API和state-oriented mocking API,我花了一点时间去琢磨,但是还是不怎么透彻,悟性不够啊,阿弥陀佛。我所知道的是behavior-oriented是指关注于被测类和它的依赖之间的交互,例如mock的时候传入的参数的灵活性,在测试的时候,是否能正常匹配上,而state-oriented,我们只关注于传入的数据和返回的结果,我们甚至都可以忽略到底是哪个类调用这个依赖,这个确实很独特,会在后面进行介绍。

下面开始三部曲的首部——请按照我期望的走。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值