【问题标题】:Junit test for boolean method布尔方法的 Junit 测试
【发布时间】:2015-05-02 16:18:53
【问题描述】:

如何使用 assertEquals 为方法 Boolean isEqual(Semester term) 创建一个测试方法,在类 Semester 中使用布尔类型?

这是学期类的代码和学期类的junit测试

学期

public class Semester {
    private String year;
    private String name;

    public Semester() {
        year = null;
        name = null;
    }

    public Semester(String year, String name) {
        this.year = year;
        this.name = name;
    }

    public boolean isEqual(Semester semestr) {
        return ((semestr.name.equals(this.name)) && (semestr.year
            .equals(this.year)));
    }

    public String getYear() {
        return year;
    }

    public String getName() {
        return name;
    }
}     

学期测试

public class SemesterTestCase1 {
    private Semester semster=new Semester("2014","Fall");

    @Test
    public void testIsEqual() {

    }

    @Test
    public void testGetYear() {
        assertEquals("2014",semster.getYear());
    }

    @Test
    public void testGetName() {
        assertEquals("Fall",semster.getName());
    }
}

【问题讨论】:

  • assertEquals(true, actualValue)assertEquals(false, actualValue) 都可以。还有assertTrue(actualValue)assertFalse(actualValue)。您是否查看过 Asserts 类的 JavaDoc?如果这些选项不起作用,请告诉我们为什么它们不起作用,更重要的是,告诉我们您实际想要完成的工作。
  • 别忘了测试NullPointerExceptions。
  • 您需要覆盖equals 而不是定义自己的isEqual 才能使用assertEquals
  • @user2418306 不一定。 equals 有它必须遵守的非常具体的合同,而像 isEqual 这样的自定义方法可以做任何它想做的事情。肯定有时间你想要一个而不是另一个。例如,假设您有一个带有id 字段以及姓名和出生日期的Person 对象。 equalsonly 检查id 可能是有意义的,因为如果您有Map<Person, Job>,您希望通过 id 来唯一标识每个人。但您可能还想检查两个 Person 对象是否具有所有相同的值,自定义 isEqual 更合适。
  • @yshavit 你能说出自定义方法可能违反的 eq​​uals 合约的规则吗?如果在您的域中,您可以保证 Person.id 是唯一的,那么竞争其余字段的意义何在?否则,您的地图将无法正常工作。

标签: java testing junit


【解决方案1】:

首先,我会更改您的isEqual()

public boolean isEqual(Semester semestr) {
        boolean flag = false;
        if (this.name != null && this.year != null 
            && this.semestr.name != null && this.semestr.year != null ){
        flag = ((semestr.name.equals(this.name)) && (semestr.year
            .equals(this.year)));
          }
           return flag;
    }

尝试使用 assertTrue 而不是 assertEquals:

 @Test
    public void testIsEqual() {
    Semester semsterTest = new Semester("2014","Fall");
    boolean res = this.semster.isEqual(semsterTest);
    assertTrue(res);
    }

当您想要测试布尔方法时,我建议您使用assertTrueassertFalse

【讨论】:

  • Fwiw,我喜欢assertTrueassertFalse,因为它们不会提供非常有用的信息。这些重载基本上只是告诉你有一个错误。如果您执行assertTrue("fall 2014", res) 之类的操作,那么您的信息将毫无帮助地只是“2014 年秋季”。如果您使用assertEquals,则错误消息将是“2014 年秋季:预期 但为 ”,这对我很有帮助。
  • 如果你使用 assertTrue("fall 2014", res) 并且测试失败,你知道预期是真的(assertTrue)并且 res 是 false(因为如果它是真的,测试是正确的)是不是吗?当您说 assertEquals 提供更多有用的信息时,您是对的,但是要阅读代码,assertTrueassertFalse 可以让您快速了解您在测试什么。我不认为assertEquals 会给你带来很多好处。我认为是基于意见的。不管怎样,谢谢你的评论:)
  • 当我将这种方式用于默认构造函数时 private Semester semster=new Semester(null,null);我收到一个空指针异常错误
  • 如果你真的想看到“预期的 但是是 ”,你可以使用 Hamcrest 扩展(根据你的 JUnit 版本捆绑)assertThat(condition, equalTo(true))
  • @Shondeslitch 是的,绝对是意见!我希望能够在测试失败之前看到预期值,甚至在我深入代码之前。是的,我可以在描述中写更多,比如assertTrue("expected fall 2014 equality to be true", res),但那时我保存了哪些与assertEquals("fall 2014 equality", true, res) 相比?与 Hamcrest 解决方案类似。基本上,我发现assertEquals 在给我有用的信息和减少我的打字之间取得了很好的平衡。但是,是的,这完全是意见,这就是为什么我把它作为评论而不是答案。 :)
【解决方案2】:

这段代码需要解决三件事。

首先,已经存在一种方法,在该方法中两个对象可以相互比较,称为equals。您想覆盖该方法而不是创建自己的相等方法。

@Override
public boolean equals(Object otherSemester) {
    // your code here
}

其次,您的方法不能容忍空值。如果将null 传递给该方法,您将得到一个很棒的NullPointerException。这需要通过确保您传入的对象不为空来解决。

if(semester != null) {
    // logic based on semester being non-null
} else {
    return false;
}

最后,您的测试可以通过一些重写来完成。您需要定义几种情况:

  • 相等的学期
  • 不相等的学期
  • 非空但非膨胀的学期(以某种方式将 null 传递给构造函数)

虽然这里的案例太多我无法一一列举,但可以使用Hamcrest matchers 进行测试。

assertThat(semester.equals(otherSemester), is(false));

【讨论】:

    【解决方案3】:

    您可以尝试 assertTrue,而不是尝试 assertEquals。

    @Test
    public void testIsEqual() {
    assertTrue(isEqual(semester));
    }
    

    assertTrue 专门用于检查布尔值。

    【讨论】:

      【解决方案4】:

      对于 Junit 中的布尔测试,最好使用 assertTrue / assertFalse

      @Test
      public void testIsEqual() {
      assertTrue(isEqual(semester)); // to check value is true
      }
      

      【讨论】:

        【解决方案5】:

        您可以使用 assertj 流利的断言来完成这项工作:

        assertThat(boolean_expression).isTrue()
        assertThat(boolean_expression).isFalse()
        assertThat(boolean_expression).isEqualTo(another_boolean_expression)
        

        更多关于http://joel-costigliola.github.io/assertj/

        【讨论】:

          猜你喜欢
          • 2020-08-23
          • 1970-01-01
          • 1970-01-01
          • 2014-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多