我想对一个类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()
方法中调用它,如上所示。
我的问题:
junit class
中使用辅助方法吗?答案 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类并回馈所需的结果。