2017-05-16 32 views
3

我正在为初级Java开发人员进行第一次求职面试的学习,现在我正在学习JUnit测试用例。这是我遇到的一个例子,我必须说它对我来说非常棘手(这是抽象的代码,所以我不知道如何测试它)。自定义方法的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."); 
    } 
} 

什么样的测试,我可以在这段代码进行任何提示吗?非常感谢你的帮助!

+1

我想你应该在另一个stackoverlfow网站上提问这个问题,就像源码评论一样。 –

+0

如果您提供Fruit,FruitInspector,Juicer和取决于果汁汁的代码,回答您的问题会更容易。此外,在您的测试示例中,您可以参考JuiceMaker类中未定义的throwsRuntime方法,因此请提供该类的完整定义。最后一件事:在你的例子中你正在访问水果对象,但它没有被定义。 – gawi

+0

我没有这些方法的任何实现。这就是我所需要做的: “在测试驱动的开发测试中,应该记录实现以及测试它,记住这一点,为这些遗留代码编写测试,然后重构以去除隐式依赖。 –

回答

3

欢迎来到JUnit,祝您的采访顺利!

要问的第一个问题是这个班级提供的合同是什么?它需要一个水果清单,测试是否有任何水果腐烂,如果是,则抛出一个异常,否则就会把它们榨干。你可以假设“juice”方法在其他地方被测试过。

对我来说,这表明这些测试:

  • 列表单佳果
  • 列表单烂水果
  • 列表与几个好,一个腐烂的水果
  • 空单

您也可以测试空值和无效值,但这可能是刚刚过度的事情。

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

2

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

你必须自己回答一个问题:是否只有循环遍历Fruitif()声明的列表。

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

这样你就不会强迫任何异常,但造成它们 - 它通过测试中的代码执行更多路径。

如果您运用上述方案,您应该有一个非常体面的方法测试覆盖率。

希望这会有所帮助!

2

您在示例答案中放置的两个测试用例朝着正确的方向,但只有中途。因为两个测试都做根本没有测试你的“受测班”。

合理的测试将更加类似于:

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); 
    } 

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

您可以从中获得错误条件以及预期结果。然后你至少为你收集的不同方面写一个测试。