在JUnit中调用@Before注释之前,更改每个测试方法的值

时间:2017-02-02 14:48:51

标签: java junit junit4

我正在为具有设置

的类编写测试
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,但在此设置被调用之前,所以我无法实现此功能。

2 个答案:

答案 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并提高你的设计技巧。