java - 如何在另一个类中测试我的方法?

标签 java methods call instance-variables

我大约 5 周前才开始学习计算机科学 (Java),但我仍然无法创建方法。我被指派创建一个 NFL 统计类,然后创建一个方法来显示计算。一切都很顺利,直到我在测试类中调用我的方法。这里似乎缺少什么?

NFLPlayer CLASS(包含方法):

private int touchdowns;
private int interceptions;
private int passingAttempts;
private int completedPasses;
private int passingYards;
private int runningYards;
private int recievingYards;
private int tackles;
private int sacks;


// Method for Quarterback rating
public double QBRating(int touchdowns, int passingAttempts, int completedPasses,
        int passingYards, int interceptions) {

        double a = (completedPasses / passingAttempts - 0.3) * 5;
        double b = (passingYards / passingAttempts - 3) * 0.25;
        double c = (touchdowns / passingAttempts) * 25;
        double d = 2.375 - (interceptions / passingAttempts * 25);
        double ratingQB = ((a + b + c + d) / 6) * 100;
        {
        return ratingQB;
        }   

}

现在这是我的测试类,我无法显示我的计算

class MyTest {
public static void main(String[] args) {

    NFLPlayer playerStats = new NFLPlayer();

    //Player1 finding quarterback rating
    int touchdowns = 2;
    int passingAttempts = 44;
    int passingYards = 285;
    int interceptions = 1;
    int completedPasses = 35;

    // Call QB rating method
    playerStats.QBRating(touchdowns, passingAttempts, completedPasses,
            passingYards, interceptions); 

    System.out.println(QBRating);
}

最佳答案

与其将如此多的 int 参数(很容易将它们混在一起)传递给您的方法,不如为每个值提供 NFLPlayer 类私有(private)字段:

public class NFLPlayer {

    private final String name;

    private int touchdowns;
    private int passingAttempts;
    private int completedPasses;
    private int passingYards;
    private int interceptions;

    public NFLPlayer(String name) {
        this.name = name;
    }

    // Method names start with a lower case character in Java
    // The name should usually be an imperative 'do something' not a noun ('something')
    // although there are exceptions to this rule (for instance in fluent APIs)
    public double calculateQbRating() {                
        double a = (completedPasses / passingAttempts - 0.3) * 5.0;
        double b = (passingYards / passingAttempts - 3.0) * 0.25;            
        // an AritmeticException will occur if passingAttempts is zero
        double c = (touchdowns / passingAttempts) * 25.0;
        double d = 2.375 - (interceptions / passingAttempts * 25.0);
        return ((a + b + c + d) / 6.0) * 100.0;
    }       

    public String getName() {
        return  name;
    }

    // setter for the touchdowns field
    public void setTouchdowns(int value) {
        touchdowns = value;
    }

    // TODO: add other setters for each private field

    @Override
    public String toString() {
        return String.format("Player %s has QB rating %s", name, calculateQbRating());
    }
}

您的申请(这不称为测试):

class NFLApplication {

    public static void main(String[] args) {      

            NFLPlayer playerStats = new NFLPlayer("johnson");    

            playerStats.setTouchdowns(2);
            playerStats.setPassingAttempts(44);
            playerStats.setPassingYards(285);
            playerStats.setInterceptions(1);
            playerStats.setCompletedPasses(35);

            double qbRating = playerStats.calculateQbRating();    

            System.out.println(qbRating);
        }
}

使用 JUnit 框架测试您的 NFLPlayer 类(JUnit 通常默认包含在您的 IDE 中):

public class NFLPlayerTest {

    // instance of the class-under-test
    private NFLPlayer instance;

    // set up method executed before each test case is run
    @Before
    public void setUp() {
        instance = new NFLPlayer(); 
    }

    @Test
    public void testCalculateQbRatingHappy() {
        // SETUP
        instance.setTouchdowns(2);
        instance.setPassingAttempts(44);
        instance.setPassingYards(285);
        instance.setInterceptions(1);
        instance.setCompletedPasses(35);

        // CALL
        double result = playerStats.calculateQbRating();  

        // VERIFY
        // assuming here the correct result is 42.41, I really don't know
        assertEquals(42.41, result);
    }

    @Test
    public void testCalculateQbRatingZeroPassingAttempts() {
        // SETUP
        // passingAttempts=0 is not handled gracefully by your logic (it causes an ArithmeticException )
        // you will probably want to fix this 
        instance.setPassingAttempts(0);

        // CALL
        double result = playerStats.calculateQbRating();  

        // VERIFY
        // assuming here that you will return 0 when passingAttempts=0
        assertEquals(0, result);
    }
}

这个测试类应该放在你的测试源目录中(通常在 yourproject/src/test/yourpackage/ 中)。它需要一些应该可以在 IDE 中轻松解析的导入,因为 JUnit 通常默认可用。

要运行测试,请右键单击它并选择“运行测试”、“测试文件”等选项,具体取决于您使用的 IDE(IDE 是 Eclipse、NetBeans 或 IntelliJ 等开发工具)。您应该会看到一些测试输出,表明测试是成功(绿色)还是失败(红色)。进行此类测试很有用,因为它会迫使您考虑您的设计并编写更好的代码。 (可测试的代码通常比难以测试的代码更好)并且因为如果新的更改导致现有代码中出现错误(回归),它会警告您。

编辑:

要创建两个具有不同统计数据的玩家,您必须创建两个实例(我添加了一个 name 字段,以便我们更容易区分玩家):

NFLPlayer player1 = new NFLPlayer("adams");
NFLPlayer player2 = new NFLPlayer("jones");

并给他们每个人自己的统计数据:

player1.setTouchdowns(2);
player1.setPassingAttempts(4);
player1.setPassingYards(6);
player1.setInterceptions(8);
player1.setCompletedPasses(10);

player2.setTouchdowns(1);
player2.setPassingAttempts(3);
player2.setPassingYards(5);
player2.setInterceptions(7);
player2.setCompletedPasses(9);

您甚至可以创建玩家列表:

List<NFLPlayer> players = new ArrayList<>();
players.add(player1);
players.add(player2);

然后您可以循环打印出所有玩家评分:

for(NFLPlayer player : players) {
    // this uses the `toString` method I added in NFLPlayer
    System.out.println(player);
}

关于java - 如何在另一个类中测试我的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40993073/

相关文章:

java - 如何为方法返回的流启用 "type information"?

java - 如何在 Ant 中重新定义目标?

python - 将 find 方法实现为资助子字符串的函数的挑战

java - 无法解析 onActivityResult 方法

java - Eclipse查看程序运行流程

java - GWT 中的 Google Drive 身份验证

java - 返回值不正确的递归方法

android - 从类扩展 View 调用方法(使用构造函数)

function - Pyan3安装说明

Java 泛型方法 - extends 关键字的用法是什么?