在junit类中有辅助方法

Rac*_*hel 5 java session junit unit-testing

我想对一个类进行单元测试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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

我的问题:

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

Nat*_*ord 5

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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)