【问题标题】:Not sure how to use Junit to verify if an object is valid不确定如何使用 Junit 验证对象是否有效
【发布时间】:2019-03-24 22:05:43
【问题描述】:

我正在尝试在 JUnit 中构建一个方法来测试对象是否为 Spherocylinder,但我无法实现覆盖。

这是我要测试的条件。

-equals 方法返回 true 的条件

-obj 不是球柱的条件

-对象标签不同的条件

-物体体积不相等的条件

-物体圆柱高度不相等的条件

这是方法,我正在尝试测试。

public boolean equals(Object obj) {

      if (!(obj instanceof Spherocylinder)) {
         return false;
      }
      else {
         Spherocylinder d = (Spherocylinder) obj;
         return (label.equalsIgnoreCase(d.getLabel())
               && Math.abs(radius - d.getRadius()) < 0.000001
               && Math.abs(cylinderHeight - d.getCylinderHeight())
                  < 0.000001);
      }  
}

   /**
    * hashcode method for equals method.
    * @return - return 0
    */
public int hashCode() {
      return 0;
}

这是我在 Junit 中编写的测试方法

 /**A test for equals() method. **/
   @Test public void equals() {
      Spherocylinder c1 = new Spherocylinder("Small Example", 0.5, 0.25);
      Spherocylinder c2 = new Spherocylinder("Different Example", 0.5, 0.25);
      Assert.assertFalse(c1.equals(c2));

      Spherocylinder d1 = new Spherocylinder("Small Example", 0.5, 0.25);
      Spherocylinder d2 = new Spherocylinder("Small Example", 0.6, 0.25);
      Assert.assertFalse(d1.equals(d2));

      Spherocylinder e1 = new Spherocylinder("Small Example", 0.5, 0.25);
      Spherocylinder e2 = new Spherocylinder("Small Example", 0.5, 0.3);
      Assert.assertFalse(e1.equals(e2));

      Spherocylinder f1 = new Spherocylinder("Small Example", 0.5, 0.25);
      Spherocylinder f2 = new Spherocylinder("Small Example", 0.5, 0.25);
      Assert.assertEquals(f1, f2);
}

我相信我已经涵盖了除以下情况之外的所有条件

-obj 不是球柱的条件

如何测试这种情况?

【问题讨论】:

  • 我认为您可以将Spherocyliner 与任何旧对象(例如字符串)进行比较。 (记住equals() 方法将 Object 作为参数,所以你可以传递任何东西。)
  • spherocylinder.equals(new Object())
  • 并且:不要将所有测试都放在一种方法中。相反,每个条件都有一种测试方法。然后给方法命名,例如 testEqualsWithEqualSpheres。经验法则:每个测试方法一个断言。并考虑使用 assertThat 和 hamcrest 匹配器。

标签: java object junit boolean equals


【解决方案1】:

你可以试试这样的:

@Test public void testDifferentObjectTypes() {
    Spherocylinder c1 = new Spherocylinder("Small Example", 0.5, 0.25);
    String s = "I am not a Sheprocylinder";
    Assert.assertFalse(c1.equals(s));
}

【讨论】:

    【解决方案2】:
    1. 首先,不要试图在一个测试方法中涵盖所有场景。这不是编写旨在实现代码覆盖率的测试方法的好方法。

    针对所有场景和各种结果类型(即阳性和阴性测试)为要测试的方法制定多种测试方法。

    例如

    @Test
    public void testEquals_verifyObjectType_success(){
     // pass same type of objects 
    }
    
    
    
    @Test
        public void testEquals_verifyObjectType_failure(){
          // pass different type of objects like `String` and `Spherocylinder` 
        }
    
      @Test
        public void testEquals_verifylabelvalue_success(){
        }
    @Test
        public void testEquals_verifylabelvalue_failure(){
        }
    

    等等等等

    1. 正确使用@Before方法,不要创建太多对象

      @Before public static void setup{ testObj1 = new Spherocylinder("Small Example", 0.5, 0.25); testObj2 = new Spherocylinder("Small Example", 0.5, 0.25); stringObject = new String("TEST_VALUE"); }

    其中 stringObjecttestObj1testObj2 在您的类中分别声明为 StringSpherocylinder 的字段。

    1. 在步骤#1 的测试方法中,就在调用测试方法之前,尝试根据场景需求对对象使用 setter 和 getter 方法来调整这些预定义对象的字段值。

    并确保在执行测试并验证结果后将这些对象恢复为原始对象。那就是您重用对象并从测试方法中删除基本测试数据准备部分(尽可能)。

    有了这个设置,您可以通过简单地为剩余场景添加新方法来实现所需的覆盖范围。

    对于下面这个,

    -obj 不是球柱的条件

    您只需要使用 Dave 已回答的不同对象类型(如 stringObject )进行调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多