繁体   English   中英

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

[英]Change the value for each test method before @Before annotation is called in JUnit

我正在为具有设置的课程编写测试

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调用每个测试方法以来,如何更改方法之间的name值? 即)如果执行testJack,则输出应为Hello Jack。 我尝试使用@Parameters,但是在调用该设置之前,我无法实现此功能。

一,代码:

 @Before
 void  setup()
{
     A a = new A();
     a.setName("Jack");
}

不执行测试可以看到的任何操作。 您正在创建一个局部变量a ,该变量几乎立即超出范围。

@Before旨在在每次测试运行之前设置和重置状态或上下文。 除非它依赖于调用之间的更改,否则它不会变化。

您可以创建一个Stack作为实例变量,并在@BeforeClass方法中对其进行预填充,并让@Before弹出一个每次调用时都要使用的值。 这是不可取的,因为它假定测试将以某些特定顺序运行。 在每个测试中声明不同的值会更加清晰明了。

这样做根本没有意义; 因为您的真正问题根源于您的语句“ 只需假设安装程序中包含30行代码 ”。

如果您需要30行设置代码,那么被测代码就没有遵循“单一职责原则”,并且做了太多不同的事情。

当然,您可以通过“数据驱动”测试以某种方式到达那里(例如,请参见此处 )。 但这将解决XY问题的Y侧。

我知道,这听起来很刺耳:但是您最好退后一步。 并了解如何进行合理的OO设计(例如,基于SOLID )。 然后,您需要重新编写代码, 无需30行设置代码。

您会发现,如果您的代码是如此难以测试; 我向您保证:这也很难理解,并且随着时间的推移几乎将无法维护/增强。 除此之外:一开始就很难使代码“正确”。

长话短说:看看这些视频 ,提高您的设计技能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM