【问题标题】:"Singleton" on JUnit testJUnit 测试中的“单例”
【发布时间】:2017-09-20 18:49:26
【问题描述】:

我已经使用 have 两年了,现在我正在尝试学习 TDD(测试驱动开发)和 JUnit,FizzBuzz Kata 看起来是一个不错的起点。所以我做到了:

public class FizzBuzz {
    public static void main(String[] args) {
        Generator generator = new Generator();
        List<String> numbers = generator.fill(1, 100);
        numbers.forEach( item -> System.out.println(item) );
    }
}

现在找到的作品我有一个关于我的GeneratorTest.java的问题:

public class GeneratorTest {
@Test
public void checkFizz() {
    //Arrange
    Generator generator = new Generator(); // This line is on every test!

    //Act
    final int fizzNumber = 3;
    final int containsFizz = 13;

    final String result1 = generator.transform(fizzNumber);
    final String result2 = generator.transform(containsFizz);

    // Assert
    assertEquals("Fizz", result1);
    assertEquals("Fizz", result2);
}

@Test
public void checkBuzz() {
    //Arrange
    Generator generator = new Generator(); // This line is on every test!

    //Act
    final int buzzNumber = 5;
    final int containsBuzz = 52;

    final String result1 = generator.transform(buzzNumber);
    final String result2 = generator.transform(containsBuzz);

    // Assert
    assertEquals("Buzz", result1);
    assertEquals("Buzz", result2);
}

@Test
public void checkFizzBuzz() {
    //Arrange
    Generator generator = new Generator(); // This line is on every test!

    //Act
    final int fizzBuzzNumber = 15;
    final int containsFizzBuzz = 53;

    final String result1 = generator.transform(fizzBuzzNumber);
    final String result2 = generator.transform(containsFizzBuzz);

    // Assert
    assertEquals("FizzBuzz", result1);
    assertEquals("FizzBuzz", result2);
}

@Test
public void checkFillSize() {
    //Arrange
    Generator generator = new Generator(); // This line is on every test!

    //Act
    final int lowerBound = 2;
    final int upperBound = 100;
    final int expectedSize = upperBound - lowerBound + 1;
    List<String> filledList = generator.fill(lowerBound, upperBound);

    //Assert
    assertEquals(expectedSize, filledList.size() );
}

@Test
public void checkFillContents() {
    //Arrange
    Generator generator = new Generator(); // This line is on every test!

    //Act
    ArrayList<String> expectedList = new ArrayList<>( Arrays.asList("1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "Fizz", "14", "FizzBuzz", "16", "17", "Fizz", "19", "Buzz", "Fizz", "22", "Fizz", "Fizz", "Buzz", "26", "Fizz", "28", "29", "FizzBuzz") ) ;
    List<String> filledList = generator.fill(1, expectedList.size() );

    //Assert
    assertEquals(expectedList, filledList);
}

@Test
public void checkFillCrossedBounds() {
    //Arrange
    Generator generator = new Generator(); // This line is on every test!

    //Act
    final int lowerBound = 100;
    final int upperBound = 1;
    final int expectedSize = 0;
    List<String> filledList = generator.fill(lowerBound, upperBound);

    //Assert
    assertEquals(expectedSize, filledList.size() );
}

有没有办法制作单身generator?如果是这样,这是一个好习惯吗?

我想在构造函数中这样做,但是我不确定是否是“正确”的方式,因为我对 JUnit 和 TDD 还很陌生。

PS:来自西班牙的问候!

【问题讨论】:

  • 为什么要单身?它似乎是一个完全无状态的对象。每次你需要一个时创建它是非常好的。你当然可以避免在每个测试方法中创建它,方法是在构造函数中创建它,或者在 @Before-annotated 方法中创建它。
  • 好吧,“单例”就是我使用的名称。也许不适合这种情况,你是对的,是一个无状态的对象。我不喜欢的是重复的代码。
  • 然后使用设置方法。这就是他们的目的。

标签: java junit tdd


【解决方案1】:

我同意 JB Nizet 的观点,每个测试都是相互独立的。

因此,您的生成器类不能是单例。
我不太了解 Java,但在每个 Test Runner 中都有一些方法,例如:

  • BeforeEach
  • 之后
  • BeforeAll
  • 毕竟

例如,您的线路 Generator generator = new Generator(); 可以是:

public class GeneratorTest {
    private Generator generator = null

    @Before
    public void runBeforeEachMethod() {
       this.generator = new Generator();
    }

    // your tests
}

因此,对于每个测试,您都有一个 Generator 的新实例。 您也可以使用BeforeAll,但是更改生成器的状态可能会导致一些不良副作用,从而使您的测试失败。

您可以查看此文档:https://www.mkyong.com/unittest/junit-4-tutorial-1-basic-usage/

【讨论】:

  • 或者你可以直接使用GeneratorTest的构造函数并标记你的变量generatorfinal。通过这种方式使用关键字final,您可以突出显示jUnit 为每个测试重新创建一个类实例这一事实。
  • @Mik378 对字段使用 final 应该是生产代码的首选首选。对于单元测试,非正式的最佳实践是在使用 @Before 注释的方法中设置非最终字段和设置。
  • @GhostCat 看看 Steve Freeman 的“Growing Object-oriented software,guided by Tests”一书,你会发现创建变量final 也是一个好习惯。
猜你喜欢
  • 1970-01-01
  • 2013-04-08
  • 2015-09-04
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多