Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中使用toString方法并对其进行测试?_Java_Testing_Tostring - Fatal编程技术网

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

如何在Java中使用toString方法并对其进行测试?,java,testing,tostring,Java,Testing,Tostring,我正在尝试创建一种方法,它根据电影的评级输出一定数量的明星。我正在使用toString方法,但不确定如何在测试中调用它。当我试图编写测试时,它说不能从静态上下文引用非静态方法。我试图使用assertEquals查看它是否使用assertEquals***,Rating.toString;输出所需的结果;。我的其他方法也有同样的问题,所以我将它们设置为静态,但这不是toString方法的选项。简单地将其他方法设置为静态是可以接受的,还是消息可能暗示我的方法和/或测试中存在一个或多个不同的缺陷?如果

我正在尝试创建一种方法,它根据电影的评级输出一定数量的明星。我正在使用toString方法,但不确定如何在测试中调用它。当我试图编写测试时,它说不能从静态上下文引用非静态方法。我试图使用assertEquals查看它是否使用assertEquals***,Rating.toString;输出所需的结果;。我的其他方法也有同样的问题,所以我将它们设置为静态,但这不是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;
    }

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

可能发生的情况是,您这样调用您的测试:

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);
您的评级等级应如下所示:

我删除了statics,并更改了toString方法以使其更简单。检查一下我是否有很多明星,因为我不确定一部2.5的电影是2星还是3星

注意到toString顶部的@Override了吗?这意味着这个方法是继承的,我建议你查一下。这对您的实际代码没有影响

你看到这个关键字了吗?它指的是类的当前实例:例如,当您添加投票时,您将增加此特定评级的投票数,而不是所有评级的投票数,就像您对静态评级所做的那样

您可以这样做:

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

在toString方法中声明结果。为什么需要任何静态的东西?您甚至不需要这个结果变量,您可以在if块中返回,然后在末尾返回一个默认值。你看到的实际错误是什么?当然,编译器只是告诉您没有结果变量。这与任何测试有什么关系?只需更改公共静态字符串结果;到公共字符串结果=;。或者更好,删除它并添加字符串result=;在您的toString开始时。您的代码与普通代码没有什么不同,重写toString方法并放置此代码不会产生任何逻辑here@JenniferM:嗯,在代码编译之前随机添加/删除static关键字肯定无法纠正任何错误。static关键字具有非常特定的含义,如果该含义与您试图编写的内容不匹配,则不应使用它。不管怎样,您仍然没有在这里描述任何实际问题。专注于你现在正试图解决的具体问题。失败的具体原因是什么?您观察到的实际错误或意外行为是什么?我不能让它工作不是一个可以回答的问题。m必须是toString方法中的某个人吗?静态的含义可能是造成我问题的原因,但我的主要问题是不知道如何使用toString方法以及如何为它编写测试和在assertEquals中使用返回字符串。我看到了以前类似于您的答案,并尝试创建该类的实例,但由于测试失败,该类似乎仍然缺少一些内容。@JenniferM现在您更新了问题,我可以看出这是一个不同的问题。但作为参考,请注意,在您的类中,您可以而且实际上应该删除所有静态关键字。它们没有任何用途,实际上会导致您的代码有缺陷。当我没有它时,我得到一条消息:非静态方法无法从静态上下文中引用以进行测试。当我把它放进去的时候,他们都通过了。@Jennifer,给你。如果您对我写的某个内容有疑问,并且找不到解释,请给我留言,我将添加详细信息^^更改toString方法可能不是一个好主意,因为它是从Object继承的方法。
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), "***"))