Java 将静态构件值带入下一个测试
我正在对一个类进行单元测试,如下所示Java 将静态构件值带入下一个测试,java,unit-testing,testng,Java,Unit Testing,Testng,我正在对一个类进行单元测试,如下所示 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; } el
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”,所以所有测试的值都应该为null。。这个假设是正确的吗?java中字段的static修饰符意味着该字段不属于该类的特定实例,而是属于类本身。在大多数情况下,在运行的JVM中只有类的范例。因此,创建这个类的多少个对象并不重要,它们都将共享一个相同的静态字段。java中某个字段上该字段的一个相同值
static
修饰符表示该字段不属于该类的特定实例,而是属于该类本身。在大多数情况下,在运行的JVM中只有类的范例。因此,创建这个类的多少个对象并不重要,它们都将共享一个相同的静态字段。该字段的一个相同值为什么要通过创建一个新实例来重新初始化静态字段?我认为您对static
关键字的含义感到困惑。这意味着字段不再属于实例。通过static
它获得一个字段,该字段由该类的所有实例共享。因此,并不是说这个类的每个实例都有自己的aStr
,它们只是共享相同的aStr
字段。当一个新对象重置其值时,有静态成员有什么意义?如果是这样的话,Java在逻辑上就会被破坏。为什么要通过创建一个新实例来重新初始化一个静态字段呢?我想你对static
关键字的含义感到困惑了。这意味着字段不再属于实例。通过static
它获得一个字段,该字段由该类的所有实例共享。因此,并不是说这个类的每个实例都有自己的aStr
,它们只是共享相同的aStr
字段。当一个新对象重置其值时,有静态成员有什么意义?如果是这样的话,Java在逻辑上就会崩溃。。我错过了。。非常感谢您的澄清。关于如何更好地测试它,有什么建议吗?@BlueEagle一旦你开始使用静态,测试就会变得更加困难。你几乎不应该这样做。如果你真的需要有静态字段,然后在@AfterMethod
@Nikem中将其设置为null
,它是一个私有成员,我必须公开一个setter来实现这一点,而不是我想做的事情。@PaulBoddington因为这是所有线程使用的一个公共值,我想让它静止是正确的模式,想法?哦,是的。。我错过了。。非常感谢您的澄清。关于如何更好地测试它,有什么建议吗?@BlueEagle一旦你开始使用静态,测试就会变得更加困难。你几乎不应该这样做。如果你真的需要有静态字段,然后在@AfterMethod
@Nikem中将其设置为null
,它是一个私有成员,我必须公开一个setter来实现这一点,而不是我想做的事情。@PaulBoddington因为这是所有线程使用的一个公共值,我想让它静止是正确的模式,想法?