我正在为初级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.");
}
}
我可以对这段代码执行哪些测试的提示?非常感谢你的帮助!
答案 0 :(得分:3)
欢迎来到JUnit,祝你的采访好运!
要问的第一个问题是这个班级提供的合同是什么?它需要一份水果清单,测试是否有任何水果腐烂,如果是这样会引发异常,否则它会榨汁。你可以假设&#34; juice&#34;方法在别处测试。
对我而言,这表明了这些测试:
您还可以测试空值和无效值,但这可能会影响现在的事情。
一旦您决定要测试什么,那么您就可以开始考虑实施它们了。看起来您的实施有几个错误,但您正朝着一个好的方向前进。你可能会发现JUnit&#34; expected&#34;用于测试异常的参数。
答案 1 :(得分:2)
您似乎正在指示测试中的JuiceMaker
实例抛出异常以验证您是否可以捕获它。
你必须自己回答是否只有这个循环遍历Fruit
和if()
语句列表。
您可以通过传递不同的列表(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);
}
等等。换句话说:你遵循休的好回答;并确定调用方法的可能方法。 ???
只是一个占位符 - 表示你应该想一想这里应该发生什么。也许你期望一个特定的例外;也许这个方法会返回一个特殊的空汁......所有这些都取决于被测方法的合同。
您可以从中获得错误条件和预期结果。然后,您至少要对所收集的不同方面进行一次测试。