Java 在junit类中具有帮助器方法

Java 在junit类中具有帮助器方法,java,unit-testing,session,junit,Java,Unit Testing,Session,Junit,我想对一个类进行单元测试,classa,但它依赖于另一个使用用户会话方法的类。我要测试的方法不涉及用户会话。我可以在类A中创建一个helper方法来复制我需要的类B方法的行为吗 我知道它不清楚,让我们挖掘一些代码来获得清晰的理解 public void testDetails() throws Exception { //Some logic that generates DetailsTOList saveDetailsHelper(DetailsTOList); in

我想对一个类进行单元测试,
classa
,但它依赖于另一个使用
用户会话
方法的类。我要测试的方法不涉及
用户会话
。我可以在
类A
中创建一个helper方法来复制我需要的
类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()
方法中调用该方法,如上所示

我的问题:

  • 我们可以在junit类中使用helper方法吗
  • 处理这种情况的最佳方法是什么

  • 助手方法将不具有@Testcase注释。您可以像编写任何其他代码一样编写测试代码,但只包含用于测试的相关方法,并且只验证该测试方法的相关部分。

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

    然而,这个问题正是您应该仔细设计类的原因。如果
    Class B
    调用数据库以获取信息,则这是划分该功能的绝佳机会。您没有澄清“依赖关系”(您是否在扩展?),但如果
    类B
    是类a的一个组件,您可以创建一个完整的存根类,作为
    类B
    的替代,并返回专门用于测试类a的硬编码(或其他编码)数据。只要
    类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;
        }
      }
    }
    

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

    如果您不能或不想在测试中使用真正的
    类B
    功能,但希望“它可以正常工作”,请查看-这可能就是您使用模拟所需的+1。这就是模仿被发明的原因。你的散文有点混乱。你应该尽量用短句。简短的句子让读者很容易知道他们在哪里失去了你。此外,如果你真的为你正在讨论的方法命名,这可能会有所帮助。这使你更容易遵循你的逻辑。最后,基本思想是创建一个类,该类的行为类似于B,它应该对定义的测试输入执行操作,并使用该类来测试a。但是,它不需要像B那样运行:它可以鹦鹉学舌地回复愚蠢的响应。就A而言,它只需要看起来像B。我不是用类A扩展类B。我从类B调用类A的方法,并将一些参数传递给该方法。这些参数是由类B中的方法计算的。在我的单元测试中,我不能引用类B并将这些方法作为类B get的用户会话调用。即使这些方法不处理用户会话,我也不能使用它们,因为我不能创建类B的对象。因此,我只是在我的单元测试类中的帮助器方法中复制了这种行为,希望这能澄清(修改后更可读…)您能创建一个类来扩展B并覆盖您需要的类B中的方法吗?或者B类的构造是问题所在?我可以创建扩展B的类,但仅仅为了测试目的而创建新类是否值得。为什么不在unit类中复制有问题的方法呢?这取决于代码的构建方式。如果A实际上并不依赖于B,只是静态地调用B,或者第三方调用B并将该信息报告给A,那么没有必要为B创建模拟类。如果A实际上依赖于B,那么最好创建一个模拟类,因为A的行为与B的行为相同。