首页 > 解决方案 > 如何获得 Java 代码覆盖率的全面覆盖?Junit 测试用例

问题描述

我正在为一门课程做作业,我需要全面了解这种方法

Eclipse 中使用 JaCoco 的代码覆盖率图像

这些是属性和构造函数,它是咖啡机的程序,这是 Recipe 类

public class Recipe {
private String name;
private int price;
private int amtCoffee;
private int amtMilk;
private int amtSugar;
private int amtChocolate;

/**
 * Creates a default recipe for the coffee maker.
 */
public Recipe() {
    this.name = "";
    this.price = 0;
    this.amtCoffee = 0;
    this.amtMilk = 0;
    this.amtSugar = 0;
    this.amtChocolate = 0;
}

我用过

    /*
 * setPrice test
 */
@Test
public void testSetPrice_1() throws RecipeException {
    r1.setPrice("25");
    r1.setPrice("0");
}

/*
 * setPrice test
 */
@Test(expected = RecipeException.class)
public void testSetPrice_2() throws RecipeException {
    r1.setPrice("adsada");
    r1.setPrice(" ");
    r1.setPrice("-1");
}

当我使用 RecipeException 时,recipeException 似乎没有被捕获,甚至认为我知道它会被抛出,但覆盖范围不会到达整个方法。

这个类是唯一一个没有完全覆盖的类,而且这个 RecipeException 似乎并不重要。

当 RecipeException 被抛出时,我应该如何进行测试以使其得到全面覆盖?

此代码属于课程 edu.ncsu.csc326.coffeemaker

标签: javajunitjacoco

解决方案


您的测试失败,因为在 testSetPrice_2 方法中,初始调用r1.setPrice("adsada");会导致 aNumberFormatException被抛出,从而中断测试的执行......

    r1.setPrice(" ");
    r1.setPrice("-1");

因此永远不会运行。要解决此问题,您需要每次调用r1.setPrice(...)

单独的测试方法,例如如下所示:

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

public class RecipeTest {
    Recipe r1;

    @Before
    public void setUp() throws Exception {
        r1 = new Recipe();
    }

    @Test
    public void testSetPriceValid_1() throws RecipeException {
        r1.setPrice("25");
    }

    @Test
    public void testSetPriceValid_2() throws RecipeException {
        r1.setPrice("0");
    }

    @Test(expected = RecipeException.class)
    public void testSetPriceInvalid0() throws RecipeException {
        r1.setPrice("adsada");
    }

    @Test(expected = RecipeException.class)
    public void testSetPriceInvalid1() throws RecipeException {
        r1.setPrice(" ");
    }

    @Test(expected = RecipeException.class)
    public void testSetPriceInvalid2() throws RecipeException {
        r1.setPrice("-1");
    }

}

推荐阅读