在我们的JUnit测试中,我们必须初始化大量的对象。我们在对象内的对象中有对象。例如:
class A {
List<B> bList;
}
class B {
List<C> cList;
}
class C {
List<D> dList;
}
正如您已经知道的那样,我们的setUp()
方法可能变得非常笨拙。另外,由于我们在所有地方使用这些对象,因此我们创建了一个util类,它将创建一个A
对象及其所有成员。所以如果我们在JUnit中需要它,我们只需要调用MyUtil.createA()
。
有更好/更简单的方法吗?或许甚至是另一项让这项任务变得不那么繁琐的技术呢?
感谢
答案 0 :(得分:0)
所以我已经遇到了很多这样的问题,解决问题的方法就是这样。但是,我发现了一个很好的模式(使用ParameterSupplier
),可以对每个级别进行详细控制。想象一下以下测试:
@Theory
public void testSetup1(@DefaultAList @DefaultBList @DefaultCList A a){...}
@Theory
public void testSetup2(@DefaultAList @DefaultBList @SomeOtherCList(config="blah") A a){...}
通过使用我拥有的模式,您可以轻松控制实例的整个结构。基本思想是你有一个TestSupplier
类,它有静态方法来创建类的实例。在TestSupplier
中提供可由ParameterSupplier
使用的注释,因此Theories
。然后,这些允许您指定如何创建复杂的多级对象。
以下是一个示例测试:ExampleTest.java
以下是整个示例项目,展示如何设置TestSuppliers
:TestExamples
以下是来自 ExampleTest 的示例测试:
@Theory
public void test1(
@DefaultTopBean @SingleMiddleBean @SingleValidBottomBean
TopBean topBean) {...}
@Theory
public void test2(
@DefaultTopBean @SingleMiddleBean @InvalidBottomBean
TopBean topBean) {...}
@Theory
public void test3(
@DefaultTopBean
@MiddleBeansWithState(states = { State.State1, State.State3 })
@MultipleValidBottomBean(count = 2)
TopBean topBean) {...}