静态成员值被输送到下一个测试
我单元测试类像下面静态成员值被输送到下一个测试
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',我应该得到所有测试的空值。是不是这个假设是正确的?
static
在java中的字段上的修饰符意味着该字段不属于该类的特定实例,而是属于类本身。在大多数情况下,您只有运行JVM中的类的范例。因此,您创建的这个类的多少个对象并不重要 - 它们都将共享一个静态字段。并且该字段具有同一个值
哦,是的..我错过了..非常感谢你的澄清。任何关于如何更好地测试它的建议? –
@BlueEagle只要你开始拥有静态,你就会让测试变得更加困难。你几乎不应该这样做。 –
如果你确实需要静态字段,那么在'@ AfterMethod'中将它设置为'null' – Nikem
为什么要通过创建新实例来重新初始化静态字段? –
我认为你对'static'关键字的含义感到困惑。这意味着一个领域不再属于一个实例。对于'static',它会得到一个由该类的所有实例共享**的字段。所以并不是说这个类的每个实例都有它自己的'aStr',它们全部共享**相同的''aStr'字段。 – Zabuza
当一个新的对象重置它们的值时,对静态成员有什么意义?如果是这样的话,Java将被逻辑破坏。 – Tom