当前位置: 首页 > 知识库问答 >
问题:

使用JUnit输出对象的测试方法

郦兴德
2023-03-14

到今天为止,我一直在研究单元测试,遇到了一个障碍。我有一个给定的方法,我想用unittest测试,这个方法可能有错误,也可能没有错误。方法如下:

@Override
public ITimeSpan intersectionWith(ITimeSpan timeSpan) {

    ITime begintime, endtime;
    if (bt.compareTo(timeSpan.getBeginTime()) > 0) {
        begintime = bt;
    } else {
        begintime = timeSpan.getBeginTime();
    }

    if (et.compareTo(timeSpan.getEndTime()) < 0) {
        endtime = et;
    } else {
        endtime = timeSpan.getEndTime();
    }
    // aangepast van >= naar <= 
    if (begintime.compareTo(endtime) <= 0) {
        return null;
    }

    return new TimeSpan(begintime, endtime);
}

此方法应该输出由两个时间跨度的重叠时间构造的新时间跨度。我为此方法编写了一个单元测试,如下所示:

@Test
public void testIntersectionWith() {
    System.out.println("intersectionWith");
    ITimeSpan timeSpan = new TimeSpan(new Time (2000,4,4,4,4), new Time(2000,5,5,5,5));
    TimeSpan instance3 = new TimeSpan(new Time (2000,4,4,4,4), new Time(2000,8,8,8,8));
    ITimeSpan expResult3 = new TimeSpan(new Time (2000,4,4,4,4), new Time(2000,5,5,5,5));
    ITimeSpan result3 = instance3.intersectionWith(timeSpan);


    assertEquals( result3, expResult3);

     }

为了相互比较对象,我重写了TimeSpan类中的equals方法,如下所示:

@Override
public boolean equals(Object obj){
        if (obj == null){
            return false;
        }
        final TimeSpan other = (TimeSpan) obj;
        if (this.bt == other.bt && this.et == other.et){
            return true;
        } 
        return false;
}

查看测试中给定的时间跨度,我希望测试能够通过,但正如您所猜测的那样,它没有通过,并且返回了一个“预期:但是是”错误。并指向代码行,其中表示:

assertEquals( result3, expResult3);

我试图理解为什么与assertEquals的比较不起作用,看起来覆盖equals方法在这里不起作用。我也尝试覆盖hashCode()方法,但这似乎没有什么区别。

共有3个答案

王岳
2023-03-14

我看到了几个问题。首先,在你的equals方法中使用. equals(),而不是==来比较相等性。其次,现在不是会导致错误的东西,但是你需要在equals方法中输入检查,或者你可以得到一个CCE。我建议你让你的ID自动生成equals方法。仅供参考,这也应该创建一个你缺少的hashCode方法。

呼延修然
2023-03-14

你的equals方法是错误的,你在其中使用了==。

试试这个:

    if (this.bt.equals( other.bt) && this.et .equals( other.et)){
莫繁
2023-03-14

@M大提琴,我认为罪魁祸首将在这里“返回新的时间跨度(开始时间,结束时间);”

public ITimeSpan intersectionWith(ITimeSpan timeSpan) {

ITime begintime, endtime;
if (bt.compareTo(timeSpan.getBeginTime()) > 0) {
    begintime = bt;
} else {
    begintime = timeSpan.getBeginTime();
}

if (et.compareTo(timeSpan.getEndTime()) < 0) {
    endtime = et;
} else {
    endtime = timeSpan.getEndTime();
}
// aangepast van >= naar <= 
if (begintime.compareTo(endtime) <= 0) {
    return null;
}
//i think the culprit is here, plz print the begintime, endtime and check what are the values its passing other than this everything is working fine
return new TimeSpan(begintime, endtime);
}
 类似资料:
  • 我正试图为一个方法编写一个测试用例,该方法基于特定的逻辑抛出异常。然而,测试用例失败了,因为预期的异常和获得的异常是不同的。 我如何解决这个问题?

  • 您好,我对Junit和Mockito的单元测试相当陌生。我认为我对这些原则有一个相当合理的理解,但我似乎找不到任何解释来解释我特别想在网上测试什么。 我想测试一个方法,它调用其他几个方法(void和non-void),该方法还实例化了方法体中的对象。不幸的是,我不能分享代码,因为它不是我的,但这里有一个通用格式: 目前我只关心测试method_1,我不能直接测试,因为它是一个私有方法,所以我必须通

  • 我正在尝试创建我的第一个测试。我必须证明一个方法返回一个ContextLambda类型,我正在使用assertSame函数测试它,但是我的测试失败了,我不知道用什么assert来测试这个,用assertEquals也失败了。我的测试是这样的:

  • 我有这两种方法,在使用Mock实现测试时遇到了困难。我该如何参加考试? 我有麻烦得到Jboss目录而不必启动System.get属性(jboss.server.temp.dir);

  • 问题内容: 我只有一种方法。如何检查System.out.println()并将Scanner替换为使用JUnit自动输入值? PS,请提供一些解决方案… 问题答案: 理想情况下,提取尴尬的依赖关系,以便您可以在没有依赖关系的情况下进行测试。更改为简单: (考虑使用a 代替for 。) 然后,您实际上不需要进行单元测试-但您可以使用基于的进行测试,并基于的输出进行测试,从而提供所需的任何输入并检查

  • 我正在创建两个单元测试来测试我的应用程序逻辑。在下面,我根据顺序是否为真创建了两个最终变量。有没有一种方法可以不必为每种订单类型创建最终变量,从而使其干燥?