Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将静态构件值带入下一个测试_Java_Unit Testing_Testng - Fatal编程技术网

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因为这是所有线程使用的一个公共值,我想让它静止是正确的模式,想法?