`
jiangduxi
  • 浏览: 458861 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Test a setter(Junit 测试setter方法)

阅读更多
问题:
   setter方法怎么简单,测试它是不是浪费时间呢?而且价值也不大!
情景:
   JUnit新手常常问的问题是:“这个set方法是否应该测呢”其实如果你谨慎认为测试是来预防错误的,那么你想这个虽然简单但是也是可能出现错误的话,就应该测试。
方法:
   最常见的set方法是在JavaBean中,bean对象有点像一个数据包:它包装了一堆数据,这些数据对外可读可写。例如:
 public void testSetProperty(){
    Bean bean = new Bean();
    bean.setProperty(newPropertyVale);
   assertEquals(newPropertyValue, bean.getProperty());
 }

描述步骤:
  1. 将Property改为你要测试的bean属性值名称。
  2. 创建一个类的实例
  3. 如果newPropertyValue是复杂类型,比如另外一个JavaBean的索引,就想要地初始化newPropertyVale
  4. 如果property是一个比字符串更复杂的对象,那么你要保证property所属的类的equals方法已经被恰当地实现。

讨论:
   如果你没有相应的get方法,并且不愿仅仅为了测试set方法而添加它,那么你需要找出set方法的可观测的点,并且验证它。
  另外一种常见的set方法应用是在Command设计模式中。如果命令被提交给命令解释器以获得执行,那么命令应该有一个相应的get方法:否则的话,命令解决器如何获取输入的参数呢?另外,如果命令遵从“行为”模式(也就是说提供自己的执行方法),那么命令本身就能完全包括输入的参数,这样就没办法直接验证set方法的行为了。这种情况下,就必须执行该命令并分析,以验证输入的参数是否正确地被set方法使用。
看个简单的例子:(该例子主要是执行银行转账行为类。)
public class BankTransferAction{
 private String sourceAccountId;
 private String targetAccountId;
 private Money amount;

 public void setAmount(Money amount){
  this.amount = amount;
}

 public void setSourceAccountId(String sourceAccountId){
  this.sourceAccountId = sourceAccountId;
}

public void setTargetAccountId(String targetAccountId){
  this.targetAccountId = targetAccountId;
}

public void execute(){
 Bank bank = Bank.getInstance();
 bank.transfer(sourceAccountId, targetAccountId, amount);
}
}

虽然这个实现中的方法都很简单,但我们不得不使用 execute()方法来测试各种set方法,因为我们没有其他可以观测的点。

注意这个实现严格遵循了execute()方法的规范:不接受任何参数。一般来讲,程序员执行这个方法是为了让超类或者接口执行当前的execute()方法。因为这个动作自己获取参数并自动执行,因此我们也不清楚,按照这个规范进行设计到底带来了声明好处。为了验证这个类的方法,我们将提交我们自己的Bank类,以验证传递给transfer方法的参数。这种办法仅有的问题是我们提交的严格“假”银行对象,而不是严格产品代码中真正使用的银行对象。可以选择一个新的execute()方法,并在bank类中公用一个setInstance方法供我们自由提交bank对象。
例如:
public class BankTransferAction{
    private String sourceAccountId;
    private String targetAccountId;
    private Money amount;

   public void setAmount(Money amount){
   this.amount = amount;
   }
   
   public void setSourceAccountId(String sourceAccountId){
     this.sourceAccountId sourceAccountId;
  }
  
  public void setTargetAccountId(String targetAccountId){
    this.targetAccountId = targetAccountId;
  }

  public void execute(){
    execute(Bank.getInstance());
   }

 public void execute(Bank bank){
   bank.transfer(sourceAccoutId, targetAccountId, amount);
 }
 }

测试代码
 public class BankTransferActionTest extends TestCase{
  
   public void testSettingInputParameters(){
    BankTransferAction action = new BankTransferAction();
    action.setSourceAccountId("source");
    action.setTargetAccountId("target");
    action.setAmount(Money.dollars(100));
    action.execute(new Bank(){
       public void transfer (String sourceAccountId, String targetAccountId, Money amount){
   assertEquals("source", sourceAccountId);
   assertEquals("target",targetAccounntId);
   assertEquals(Money.dollars(100), amount);
 }
  });
  }

}

分享到:
评论

相关推荐

    软件测试(Junit单元测试)汇编.pdf

    Junit提供了一些注解和断言,例如@Before、@After、@Test等,用于描述测试用例的生命周期和测试用例的断言。Junit单元测试可以帮助开发者快速地测试Java应用程序,提高软件的可靠性和稳定性。 四、 数据库开发过程...

    JUnit单元测试.pdf

    ### JUnit单元测试知识点 ...无论是简单的单个方法测试还是复杂的多方法测试组合,JUnit都能提供丰富的功能支持。掌握JUnit的基本用法对于提高代码质量、减少bug、加快开发进度等方面都有着重要的作用。

    JUnit4利用反射机制测试类的私有成员

    2. 在测试类中,使用`@Test`注解标注测试方法。 3. 在测试方法内,获取要测试的类实例,如`Commodity_Child child = new Commodity_Child()` 4. 使用`child.getClass()`获取`Commodity_Child`的`Class`对象。 5. ...

    大量JUnit学习资料

    相比早期的JUnit 3.x版本,4.1不再要求测试方法必须以`test`开头,而是通过`@Test`注解来标记测试方法。 在Eclipse IDE中,使用JUnit非常方便,因为IDE通常已经集成了JUnit库。创建一个新的Java项目后,你可以开始...

    JUnit是什么?介绍

    10. **避免依赖测试顺序**:尽管 JUnit 使用 Vector 存储测试方法,测试顺序可能会因平台而异,因此测试应独立于执行顺序。 通过遵循这些实践,开发者可以有效地利用 JUnit 来保障代码的质量,提高开发效率,以及...

    springjunit

    `@Test`注解标记测试方法,SpringJUnit会自动运行这些方法,并且支持各种断言,例如`assertEquals`、`assertTrue`等,来验证方法的预期结果。 在实际使用中,我们通常会创建一个测试类,继承自`SpringJUnit4Class...

    JUnit学习笔记JUnit学习笔记JUnit学习笔记

    在JUnit 4.1中,测试方法的命名可以自由选择,不再强制要求以`test`开头,但需要使用`@Test`注解来标识。同时,`setUp`和`tearDown`方法分别用`@Before`和`@After`注解,它们会在每个测试方法执行前后自动调用,用于...

    property-asserter:Java 属性 gettersetter 自动单元测试

    财产断言者这是一个 Java JUnit 测试实用程序,可以轻松测试属性的getter/setter方法。 该实现最初由 Scott Leberknight 编写,并在讨论过 我自己 Josef Betancourt 在时再次讨论了这个问题最近原始源代码存档不可用...

    单元测试教程

    - **Code a little, test a little:** 在编写代码的过程中随时进行测试,即编写一小段代码后立即对其进行测试。 - **Code all, test all:** 在完成全部编码工作后,再进行全面的测试。 **1.3 责任主体** - **由...

    spring-database.zip

    本文将详细探讨如何在一个空的Spring Boot 2项目中集成并配置Druid,以及如何启动Druid的监控平台,同时提供Controller、Service、Entities和JUnit测试的例子。 首先,我们需要创建一个基于Spring Boot 2的新项目,...

    Eclipse for JavaEE图解教程

    Eclipse for JavaEE 图解教程 Eclipse 是一个功能强大且...通过本教程,我们可以学习到 Eclipse 的一些重要用法,例如自动生成 Getter、Setter 和构造方法、自动生成接口和 JUnit 测试类、定制视图与 New 菜单项等。

    making-sense-dependency-injection-test-execution-listener-源码.rar

    在JUnit等单元测试框架中,测试执行监听器是一个可以监听测试执行过程的接口,它定义了一系列回调方法,如beforeTest、afterTest、onFailure等。开发者可以通过实现这些方法,自定义测试执行前后的逻辑,比如在每个...

    SpringTest

    总结起来,"SpringTest"案例旨在展示Spring框架的基本使用方法,包括创建配置文件、定义bean、依赖注入以及在MyEclipse环境中进行测试。通过这个简单的HelloWorld示例,学习者可以对Spring的核心理念和操作有初步的...

    Java的注解包,在使用注解的时候导入的jjar包

    `@Test`用于标记测试方法,`@Before`和`@After`则分别用于在每个测试方法执行前和后运行一段代码,进行初始化或清理工作。此外,还有`@Ignore`用于忽略特定测试,`@Expected`用于指定预期的异常等。 `hamcrest-core...

    语言程序设计资料:netbeans基础教程.doc

    - 实现`Book`类,包括两个属性`id`和`name`及其对应的getter和setter方法。 #### 四、编写JUnit测试用例 - **JUnit**是Java平台上的单元测试框架,广泛用于验证Java类的行为。 - 在NetBeans中创建测试类`BookTest...

Global site tag (gtag.js) - Google Analytics