静态或非静态方法中的JUnit测试数据

问题描述

喜欢知道哪个好。

我必须将一些JUnit测试数据保存在另一个文件中。让我们将其称为TestingData.java。我想通过两种方式做到这一点。

第一条路

TestingData.java

public class TestingData {
  protected String getHelloWorld() {
    return "Hello World";
  }
}

第二种方式

TestingData.java

public class TestingData {
  public static String getHelloWorld() {
    return "Hello World";
  }
}

通过扩展TestingData类,我可以在测试服务中这样称呼 First Way

@RunWith(MockitoJUnitRunner.class)
public class SomeServiceTest extends TestingData {
  @Test
  public void helloWorldtest() {
    assertEquals("Hello World",getHelloWorld());
  }
}

通过调用静态函数TestingData.getHelloWorld()

在测试服务中调用第二种方式
@RunWith(MockitoJUnitRunner.class)
public class SomeServiceTest {
  @Test
  public void helloWorldtest() {
    assertEquals("Hello World",TestingData.getHelloWorld());
  }
}

喜欢知道哪种方法在纯净代码原则上更好

解决方法

答案可能与“干净的代码”无关,而是根据您当前和将来的使用情况而有所不同。

First Way 中扩展夹具类创建了一个重要的限制-您将无法扩展任何其他基类,并且这种情况在单元测试中经常发生。

第二种方式中的静态方法不能被覆盖。

您可以使用第三种方式,这是具有默认方法的界面。这不会将您限制为特定的基类,并且如果将来将来需要,则其默认方法可能会被覆盖:

public interface TestingData {
  default String getHelloWorld() {
    return "Hello World";
  }
}

@RunWith(MockitoJUnitRunner.class)
public class SomeServiceTest implements TestingData {
  @Test
  public void helloWorldTest() {
    assertEquals("Hello World",getHelloWorld());
  }
}
,

如果您有多个测试类共享同一个父类。您可以定义abstract类,并放置所有常见的属性和行为。

,我建议将静态内容声明为static final,不要硬编码。

这样,您可以选择创建一个方法,并在每个测试用例中从子级中调用它,如下所示:

public abstract class TestingData {
  
  private static final GET_HELLO_WORLD = "Hello World";

  public void setUp() {
      // common setUp
  }

  protected String getHelloWorld() {
    return GET_HELLO_WORLD;
  }
}
@RunWith(MockitoJUnitRunner.class)
public class SomeServiceTest extends TestingData {

  @Before
  public void setUp() {
      super.setUp();
      // Add more settings
  }
  
  @Test
  public void helloWorldTest() {
    assertEquals("Hello World",getHelloWorld());
  }
}

,或者直接从子级中调用常量

public abstract class TestingData {
  
  protected static final GET_HELLO_WORLD = "Hello World";

  public void setUp() {
      // common setUp
  }
}
@RunWith(MockitoJUnitRunner.class)
public class SomeServiceTest extends TestingData {

  @Before
  public void setUp() {
      super.setUp();
      // Add more settings
  }
  
  @Test
  public void helloWorldTest() {
    assertEquals(callTargetTestMethod(),GET_HELLO_WORLD);
  }
}