我正在为具有设置
的类编写测试class A
{
private String name;
public String getName()
{
return "Hello "+ name;
}
public void setName(String name)
{
this.name = name;
}
我的考试班
TestA
A a = new A();
{
@Before
void setup()
{
a.setName("Jack");
}
@Test
public void testTom()
{
assert(a.getString(), "Hello Tom");
}
@Test
public void testJack()
{
assert(a.getString(), "Hello Jack");
}
如何更改方法之间的名称值,因为@Before会调用每个测试方法? ie)如果执行testJack,那么输出应该是Hello Jack。 我尝试使用@Parameters,但在此设置被调用之前,所以我无法实现此功能。
答案 0 :(得分:0)
首先,代码:
@Before
void setup()
{
A a = new A();
a.setName("Jack");
}
不执行测试可以看到的任何内容。您正在创建一个局部变量a
,它几乎立即超出范围。
@Before
用于在运行每个测试之前设置和重置状态或上下文。它不会改变,除非它依赖于调用之间的变化。
您可以将堆栈创建为实例变量,并使用@BeforeClass
方法预先填充它,并让@Before
弹出一个值,以便在每次调用时使用。这是不可取的,因为它假定测试将以某种特定顺序运行。在每个测试中声明不同的值会更清晰,更清晰。
答案 1 :(得分:0)
这样做毫无意义;因为你的真正的问题根植于你的陈述“假设在设置中有30行代码的情景”。
如果您需要30行设置代码,那么您的测试代码不遵循“单一责任原则”并且执行太多不同的事情。
当然,您可以转向“数据驱动”测试以某种方式到达那里(例如,请参阅here);但这将修复XY problem的Y侧。
我知道,这听起来很刺耳:但你最好退后一步;并学习如何进行合理的OO设计(例如基于SOLID)。然后,您将代码重新编写为不需要30行设置代码。
你看,如果你的代码很难测试;我向你保证:它也很难理解,随着时间的推移几乎不可能维持/增强。除此之外:首先让你的代码“正确”是很难的。
长话短说:看看这些videos并提高你的设计技巧。