5

我想对一个类进行单元测试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从用户那里获取会话信息,我可以从 JUnit 类中设置会话信息。

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

我的问题:

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

3 回答 3

3

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

但是,这个问题正是您应该仔细设计类的原因。如果Class B调用数据库获取信息,这是划分该功能的绝佳机会。您没有澄清“依赖关系”(您在扩展吗?),但如果Class B是 A 类的一个组件,您可以创建一个完整的存根类,它是 for 的替代品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;
    }
  }
}
于 2012-06-05T18:26:20.930 回答
1

辅助方法将没有 @Testcase 注释。您将像编写任何其他代码一样编写测试代码,但仅包含用于测试的相关方法,并仅验证该测试方法的相关部分。

于 2012-06-05T18:18:41.250 回答
1

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

于 2012-06-05T18:28:25.170 回答