JUnit自定义方法的测试用例

时间:2017-05-16 15:43:08

标签: java junit

我正在为初级Java开发人员的第一份工作面试而学习,现在我正在尝试学习JUnit测试用例。这是我遇到的一个例子,我必须说它对我来说真的很棘手(它的抽象代码所以我不知道如何测试它)。

public class JuiceMaker {

  public Juice makeJuice(final List<Fruit> fruits) throws RottenFruitException {
    for (final Fruit fruit : fruits) {
      if (FruitInspector.isFruitRotten(fruit)) {
        throw new RottenFruitException(fruit.getName() + “ is rotten. Cannot make juice.”);
      }
    }

    return Juicer.juice(fruits);
  }
} 

我设法自己创造的唯一例子是:

JuiceMaker jm = new JuiceMaker();

@Test
public void isThrowingException() {
//when
  try {
      jm.throwsRuntime();
      Assert.fail("Expected exception to be thrown");
  } catch (RottenFruitException e) {
//then
      assertThat(e)
          .isInstanceOf(RottenFruitException.class)
          .hasMessage((fruit.getName() + " is rotten. Cannot make juice.");
  }
}

我可以对这段代码执行哪些测试的提示?非常感谢你的帮助!

3 个答案:

答案 0 :(得分:3)

欢迎来到JUnit,祝你的采访好运!

要问的第一个问题是这个班级提供的合同是什么?它需要一份水果清单,测试是否有任何水果腐烂,如果是这样会引发异常,否则它会榨汁。你可以假设&#34; juice&#34;方法在别处测试。

对我而言,这表明了这些测试:

  • 单一水果的清单
  • 单一烂水果名单
  • 列出了几个好的和一个腐烂的水果
  • 清单

您还可以测试空值和无效值,但这可能会影响现在的事情。

一旦您决定要测试什么,那么您就可以开始考虑实施它们了。看起来您的实施有几个错误,但您正朝着一个好的方向前进。你可能会发现JUnit&#34; expected&#34;用于测试异常的参数。

答案 1 :(得分:2)

您似乎正在指示测试中的JuiceMaker实例抛出异常以验证您是否可以捕获它。

你必须自己回答是否只有这个循环遍历Fruitif()语句列表。

您可以通过传递不同的列表(JuiceMaker.makeJuice(),空的,没有腐烂的水果,腐烂的水果)来更好地影响null

通过这种方式,您不会强制执行任何异常,而是会导致它们 - 这会在您测试的代码中运行更多路径。

如果你运用上述方案,你应该对你的方法有一个非常不错的测试覆盖率。

希望这有帮助!

答案 2 :(得分:2)

您在示例答案中提出的两个测试用例正朝着正确的方向发展,但只有中途。因为两个测试都完全没有测试你正在测试的#34;。

合理的测试看起来更像:

public class JuiceMakerTest {
  private JuiceMaker underTest;

  @Before
  public void setup() { underTest = new JuiceMaker; }

  @Test(expected=RottenFruitException.class)
  public void testThrowsOnRottenFruit() {
    underTest.makeJuice(Collections.singletonList("rotten apple"));
  }

  @Test(expected=???)
  public void testWithNullList() {
    underTest.makeJuice(null);
  }

  @Test(expected=???)
  public void testWithEmptyList() {
    underTest.makeJuice(Collections.emptyList());
  }

  @Test
  public void testXyz() {
   Juice expectedResult = ...
   assertThat(underTest.makeJuice(Collections.singletonList("apple")), is(expectedResult);
  }

等等。换句话说:你遵循休的好回答;并确定调用方法的可能方法。 ???只是一个占位符 - 表示应该想一想这里应该发生什么。也许你期望一个特定的例外;也许这个方法会返回一个特殊的空汁......所有这些都取决于被测方法的合同。

您可以从中获得错误条件和预期结果。然后,您至少要对所收集的不同方面进行一次测试。