如何在Java中使用toString方法并对其进行测试?

时间:2018-02-08 10:33:08

标签: java testing tostring

我试图创建一种方法,根据电影的评级输出一定数量的星星。我使用的是toString方法,但我不确定如何在我的测试中调用它。当我尝试编写测试时,它表示"非静态方法不能从静态上下文中引用"。我试图使用assertEquals来查看它是否用" assertEquals(" ***",Rating.toString())输出所需的结果;&#34 ;。我的其他方法有同样的问题所以我把它们设置为静态,但这不是toString方法的选项。简单地让其他方法保持静态,或者消息是否可能暗示我的方法和/或测试中存在不同的缺陷(或缺陷)?如果它在代码中是一个更大的问题,这实际上可能会产生相同的答案,但是当toString不能是静态时,如果它给出相同的消息(非静态方法不能引用..),我将如何测试toString?

我已经回顾了有关toString方法和测试的其他问题,但是我无法将其与我自己的代码相关联。此外,我不确定我是否处理了一个错误或多个错误,这使得它成为一个难以解决的问题。非常感谢帮助。

public class Rating {

    public static int votes;
    public static double score;
    public static String result;


    public Rating() {
        votes = 0;
        score = 0;
    }

    public static void resetVotes(){
        Rating.votes = 0;
        Rating.score = 0;
    }

    public static int getNumVotes(){
        return Rating.votes;
    }

    public static void addVote(double rating){
        Rating.votes = Rating.votes + 1;
        Rating.score = Rating.score + rating;
    }

    public static double computeScore() {
        return (Rating.score / Rating.votes);
    }


    public String toString() {

        if (Rating.votes > 1)
        {
            if (computeScore() > 1 && computeScore() < 2)
            {
                result = "*";
            }
            else if (computeScore() > 2 && computeScore() < 3)
            {
                result = "**";
            }
            else if (computeScore() > 3)
            {
                result = "***";
            }
            else if (computeScore() < 1)
            {
                result =  " ";
            }
        }

        return result;
    }

2 个答案:

答案 0 :(得分:1)

这里没有任何静态变量或方法。

可能发生的事情是你用这种方式调用了测试:

AssertEquals(Rating.getNumVotes(), 5);
Rating.addVote(5.5d);
AssertEquals(Rating.getNumVotes(), 6);
AssertEquals(Rating.computeScore(), 42);

这意味着您只有一个评级,即您正在修改的评级。您要做的是创建此类的实例,该实例将表示特定的评级。所以你的测试应该是这样的:

Rating r1 = new Rating(); //An instance of Rating
r1.addVote(4.3d);
r1.addVote(4d);
r1.addVote(2.5d);
r1.addVote(5d);

Rating r2 = new Rating(); // Another instance of Rating
r2.addVote(4d);

AssertEquals(r1.getNumVotes(), 4);
AssertEquals(r2.getNumVotes(), 1);

您的评级类应如下所示:

  • 我删除了static,并更改了toString()方法以使其更简单。虽然我不确定2.5电影是2星级还是3星级,但我确定我获得了很多明星。

  • 请注意@Override顶部的toString()?这意味着此方法继承,我建议您查阅一下。这对您的实际代码没有影响。

  • 您看到了this个关键字?它指的是该类的当前实例:例如,当您添加投票时,您会像使用静态投票那样,将此特定评级的投票数量,而不是所有评级投票。

    public class Rating {

    public int votes; public double score; public String result; public Rating() { votes = 0; score = 0; } public void resetVotes(){ this.votes = 0; this.score = 0; } public int getNumVotes(){ return this.votes; } public void addVote(double rating){ this.votes = this.votes + 1; this.score = this.score + rating; } public double computeScore() { return (this.score / this.votes); } @Override public String toString() { String result; double score = computeScore(); if (this.votes > 1) { if (score <= 0) result = ""; else if (score <= 1) result = "*"; else if (score <= 2) result = "**"; else if (score <= 3) result = "***"; else result = "****"; } else result = "No votes."; return result; } }

答案 1 :(得分:0)

你可以这样做:

public class yourclass {
    public static String toString(bool votes, int computeScore ) {

        if (votes)
        {
            if (computeScore > 1 && computeScore < 2)
            {
                result = "*";
            }
            else if (computeScore > 2 && computeScore < 3)
            {
                result = "**";
            }
            else if (computeScore > 3)
            {
                result = "***";
            }
            else if (computeScore < 1)
            {
                result =  " ";
            }
        }

        return result;
    }
}

然后你可以在你的测试中调用那个

assertEquals(yourclass.toString(true, 1), "*"))
assertEquals(yourclass.toString(true, 2), "**"))
assertEquals(yourclass.toString(true, 3), "***"))
assertEquals(yourclass.toString(true, 4), "***"))