在junit类中有辅助方法

时间:2012-06-05 18:14:57

标签: java unit-testing session junit

我想对一个类Class A进行单元测试,但它依赖于另一个使用user session方法的类。我想测试的方法不涉及user session。我可以在Class A中创建一个帮助方法来复制我需要的Class B方法的行为吗?

我知道它不清楚,让我们挖掘一些代码以获得清晰的理解......

public void testDetails() throws Exception
{
    //Some logic that generates DetailsTOList
    saveDetailsHelper(DetailsTOList);
    int detailsSize = getDetailsSize();
    assertNotNull(detailsSize);
}

现在getDetailsSize()从数据库中获取大小信息。 Class B有这个方法,但我无法创建Class B的对象并测试此方法,因为Class B从User获取会话信息,我可以从JUnit类设置会话信息。

我创建了saveDetailsHelper方法来复制Class B - saveDetails()方法的行为,并在testDetails()方法中调用它,如上所示。

我的问题:

  1. 我们可以在junit class中使用辅助方法吗?
  2. 处理这种情况的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

JUnit类的功能与java中的其他类一样;欢迎你有辅助功能。决定是否运行其他函数的唯一因素是(取决于junit的版本)是否有注释指示线束将其作为测试运行。

但是,这个问题正是您应该仔细设计课程的原因。如果Class B调用数据库以获取信息,那么这是划分该功能的绝佳机会。你没有说明'依赖'(你正在扩展吗?),但如果Class B是A类的一个组件,你可以创建一个完整的存根类,它是Class B的一个代表,并返回专门用于测试A类的硬编码(或其他编码)数据。只要Class B代理的签名相同,您就可以对A类有信心。

制作测试类的这些内部类通常很有用,可以防止工作区中出现太乱的情况。

public class testA {

  @Test
  public void testDetails {
    ClassA a = new ClassA();
    a.setDependency(new StubClassB());
    //run your test
  }


  private class StubClassB() extends ClassB {
    public boolean saveDetails() {
      //return fake information;
    }
  }
}

答案 1 :(得分:1)

Helper方法不会有@Testcase注释。您可以像编写任何其他代码一样编写测试代码,但只包含相关的测试方法,并仅验证该测试方法的相关部分。

答案 2 :(得分:1)

您可以将辅助方法放在测试类中,省略Testcase注释并在需要的地方调用它(如果所有测试都需要,则按方法或在您的设置中进行调整)。但可能更好的解决方案是使用类似JMock的东西来表示B类并回馈所需的结果。