【问题标题】:Junit : Test case for New Method which Returns ObjectJunit:返回对象的新方法的测试用例
【发布时间】:2015-11-03 16:12:04
【问题描述】:

我是 Junit 的新手。我正在尝试遵循 TDD。我的任务是为一种新方法编写一个测试用例。我方法的签名是public Message getMessage(String id)

职责getMessage(String id)以messageId为参数查询DB,从resultSet填充Message对象并返回。

消息 Bean 有四个成员

  • messageID:整数
  • 消息:字符串
  • 创作日期:日期
  • 作者:字符串

我的困惑是:

  • 如何编写一个使用 Dummy ID 作为方法参数的测试用例,然后验证返回的 Object Message 是否有一些预定义的虚拟值?

【问题讨论】:

  • 你想在这里测试什么?听起来您需要数据库中的一些测试数据。
  • 了解模拟。
  • 你是如何连接到数据库的?您使用的是 JDBC 驱动程序还是对象关系管理器?您可能需要模拟连接。单元测试不会触及实时数据库。单元测试应该快速运行,并且应该尽可能地隔离被测代码。添加一个真实的数据库(即使有测试数据)会引入太多变量,以至于测试变得没那么有用。
  • @BobbyStJacques 不要为 DAO 编写单元测试:petrikainulainen.net/programming/testing/…
  • 我正在使用 JDBC 驱动连接数据库。我知道我需要模拟连接/但是,我的困惑是如何使用虚拟数据验证/断言该方法的输出。所以,我需要测试用例的帮助。

标签: java junit tdd


【解决方案1】:

有两种方法。

  1. 如果您想在此方法中测试数据访问层代码,请使用 DBUnit。您需要先插入样本数据,然后使用此函数进行查询。测试完成后,删除样本数据。

    http://dbunit.sourceforge.net/

  2. 如果您只想检查业务逻辑。然后,您可以使用 powermock 或 easymock 模拟 getMessage 方法中的所有方法调用。并且只测试这个方法。在此处检查 powermock https://github.com/jayway/powermock

【讨论】:

    【解决方案2】:

    当我有一些“预期”的复杂对象时,我使用 Spring 来构建它。

    例如:

    实体类:

    public class Person {
        private long id;
        private String name;
        private int age;
        // getters, setters, constructors goes here
        // ! IMPORTANT ! equals and toString must be implemented properly.
    }
    

    测试方法:

    public class SomeClass {
       public static Person getPerson(long id) {
          // return some real Person object from database
       }
    }
    

    为了编写我的“预期”对象,我使用 Spring:

    <bean id="person" class="Person">
       <property name="id" value="1">
       <property name="name" value="John">
       <property name="age" value="42">
    </bean>
    

    然后在测试方法中:

    Person expected = springContext.getBean("person", Person.class);
    Person actual = SomeClass.getPerson(1);
    assertEquals(expected, actual);
    

    如果你还没有实现getPerson,你可以使用类似Mockito的东西来模拟这个方法并返回dumm对象,它也可以用Spring构造。

    【讨论】:

    • 感谢您的回答,但我需要在没有 Spring 的情况下编写此测试用例。你能给我一个不使用 Spring 的实现吗?
    • 好的,如果你不能使用 Spring 进行测试,那就显式地创建对象。喜欢Person person = new Person(); person.setId(1);...
    • 但我想模拟数据库,不想使用真实数据库进行测试。
    猜你喜欢
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多