【问题标题】:JUnit test for setter methodsetter 方法的 JUnit 测试
【发布时间】:2018-03-28 11:29:49
【问题描述】:
    public class Room extends java.lang.Object implements java.io.Serializable {

            public String description;
            public Map<String, Room> map;
            public List<Thing> things;

            //Room
            //Parameters:
            //desc - Description for the room Note: any newlines in desc will be 
            replaced with *

            public Room(java.lang.String desc){
                this.description = desc;
            }
            //getDescription
            //A description of the room
            //Returns:
            //Description

            public java.lang.String getDescription(){
                return description;
            }
            //replaceLine
            //any new line in s will be replaced with *

            public String replaceLine(String s){
                return s.replace("\n", "*");
            }

            //setDescription
            //Change Room description Note: any newlines in s will be 
            //replaced with *
            //Parameters:
            //s - new Description

            public void setDescription(java.lang.String s){
                    this.description = replaceLine(s);
            }
}

我正在尝试为最后一个方法编写一个 Junit 测试:

@Test
    public void setDescription(java.lang.String s) {
        String input = "abc\n";
        String expected = "abc";
        setDescription(input);
        assertEquals(expected, input);
    }

我知道这是不正确的,但我不知道如何解决它。我对 Java 和整个编码都很陌生。有人可以帮我吗?

【问题讨论】:

  • 你是如何在测试中构造Room 对象的?
  • 你为什么期望"abc" 会是"abc*"
  • UnitTests 验证单元的公共可观察行为,即:返回值与依赖项的通信setter 方法仅更改我们未验证的对象的内部状态
  • @TimothyTruckle 我会说这是公开可观察的,因为我们有一个吸气剂
  • @user7 getter 无关紧要 - 它不应该被测试。在这里,您可能出于不同的原因想要对其进行测试 - 它不仅仅是 setter,它内部还有一个逻辑。 stackoverflow.com/questions/6197370/…

标签: java


【解决方案1】:

这是你的测试:

@Test
  public void testSetDescription() {
    Room instance = new Room("test");
    instance.setDescription("abc\n");
    assertEquals("abc*", instance.getDescription());
  }

assertEquals 方法超载,可以以多种方式使用。在这种情况下,我们首先将期望放在第二位,我们从对象中真正拥有(实际数据)。但在现实生活中,最有用的测试是只检查单个方法的测试,但在您的情况下,您调用一种方法但实际上测试另一种方法。在实际项目中,您不应该测试 getter 和 setter。只有业务逻辑,因为如果您要测试每个方法,您将有更多时间编写主代码。

【讨论】:

  • 感谢Aleks,它就像一个魅力一样工作,但你知道如果我在放置testSetDescription(java.lang.String s) 时这样做它不起作用吗? i.imgur.com/KtFqnGg.png
  • 它工作。但是在您的代码中,您期望“abc\n”而不是“abc*”,就像您的代码中一样:s.replace("\n", "*");
  • 如果你想写测试,你必须问自己几个问题: 1 - 我需要测试什么? 2 - 我需要将什么参数传递给该方法? 3 - 我期望的结果。
【解决方案2】:

假设您已经为测试类创建了一个 Room 实例。

...
Room room = new Room("test room");
...
@Test
public void testSetDescription() {
    assertEquals("abc", room.setDescription("abc"));
    assertEquals("abc*", room.setDescription("abc\n"));
}

您可以根据自己的期望添加更多此类断言。 setDescription 如何处理空字符串或空输入;所有这些用例都可以在您的 UT 中断言。

顺便说一句,您不必显式扩展 Object.每个类都通过继承直接或间接地从 Object 隐式扩展。您也不必使用 java.lang 包中任何内容的完全限定名称。它们是隐式导入的。此外,如果 replaceLine 应该是公共 API 的一部分,您可能需要为此添加类似的单元测试用例,例如 public void testReplaceLine() {...}。欢迎来到 Java 编程!

【讨论】:

【解决方案3】:

我没有发现问题。你能发布错误吗?

在第一堂课中replaced with *在注释块之外,你必须把//放在那个句子之前

单元测试没有测试您的Room 类,您必须执行以下操作:

@Test
public void testDescription(java.lang.String s) {
    String input = "abc\n";
    String expected = "abc";

    //create your Room instance 
    Room myRoom = new Room(input);//why using a constructor with description if you set the description after?
    //set the description in your Room instance
    myRoom.setDescription(input);

    //test your set-get Description against your expected result
    assertEquals(expected, myRoom.getDescription());
}

【讨论】:

  • 我试过你的帮助,结果是这样的:(i.imgur.com/LJQWR0u.png
  • 对不起,我想在我离开 (java.lang.String s) 离开 testDescription() 之后,它就可以工作了。把我想我必须把它放在我的方法中吗?
  • 只需要检查expected = "abc*"
  • 我认为您混淆了 JUnit 测试目标。你必须测试你的 Room 类。你设置了描述,你必须测试 getDescription() 是否有预期的结果。你不需要在你的测试中设置和获取......你的测试方法不需要有参数,因为你在测试中定义输入和预期的字符串。 “public void testDescription()”应该足够了(感谢 Amir 的英文更正)
猜你喜欢
  • 1970-01-01
  • 2012-07-14
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
相关资源
最近更新 更多