静态成员值被输送到下一个测试

问题描述:

我单元测试类像下面静态成员值被输送到下一个测试

public class A { 
private static String aStr = null; 

public void doSomething() { 
    if (null == aStr) { 
     // do something to init aStr, and this initialized val gets cached for future calls. 
     aStr = some_val; 
    } else { 
     // do something else using aStr value. 
    } 
} 

查阅而单元测试此我做:

public class ATest { 
private A a; 

@BeforeMethod 
public void setup() { 
    a = new A(); 
} 

    @Test 
    public void test1() { 
    a.doSomething(); 
    // assert on some_val being fetched correctly. 
    } 

    @Test 
    public void test2() { 
    a.doSomething(); 
    // assert again for some_val 

    // this is where some_val fetching is not invoked at all, while debugging I 
    // can see that aStr is already being initialized from previous test. 
    } 
} 

我被假设由于我重新初始化在@BeforeMethod设置中的对象'a',我应该得到所有测试的空值。是不是这个假设是正确的?

+2

为什么要通过创建新实例来重新初始化静态字段? –

+1

我认为你对'static'关键字的含义感到困惑。这意味着一个领域不再属于一个实例。对于'static',它会得到一个由该类的所有实例共享**的字段。所以并不是说这个类的每个实例都有它自己的'aStr',它们全部共享**相同的''aStr'字段。 – Zabuza

+0

当一个新的对象重置它们的值时,对静态成员有什么意义?如果是这样的话,Java将被逻辑破坏。 – Tom

static在java中的字段上的修饰符意味着该字段不属于该类的特定实例,而是属于类本身。在大多数情况下,您只有运行JVM中的类的范例。因此,您创建的这个类的多少个对象并不重要 - 它们都将共享一个静态字段。并且该字段具有同一个值

+1

哦,是的..我错过了..非常感谢你的澄清。任何关于如何更好地测试它的建议? –

+1

@BlueEagle只要你开始拥有静态,你就会让测试变得更加困难。你几乎不应该这样做。 –

+0

如果你确实需要静态字段,那么在'@ AfterMethod'中将它设置为'null' – Nikem