如何在Java中使用toString方法并对其进行测试?
我正在尝试创建一种方法,它根据电影的评级输出一定数量的明星。我正在使用toString方法,但不确定如何在测试中调用它。当我试图编写测试时,它说不能从静态上下文引用非静态方法。我试图使用assertEquals查看它是否使用assertEquals***,Rating.toString;输出所需的结果;。我的其他方法也有同样的问题,所以我将它们设置为静态,但这不是toString方法的选项。简单地将其他方法设置为静态是可以接受的,还是消息可能暗示我的方法和/或测试中存在一个或多个不同的缺陷?如果这在代码中是一个更大的问题,那么这实际上可能会得到相同的答案,但是当toString给出相同的消息时,非静态方法不能被引用,我该如何测试它呢。。何时toString不能是静态的 我已经回顾了关于toString方法和测试的其他问题,但是我很难将其与我自己的代码联系起来。此外,我不确定我是在处理一个错误还是多个错误,这使得它成为一个难以解决的问题。非常感谢您的帮助如何在Java中使用toString方法并对其进行测试?,java,testing,tostring,Java,Testing,Tostring,我正在尝试创建一种方法,它根据电影的评级输出一定数量的明星。我正在使用toString方法,但不确定如何在测试中调用它。当我试图编写测试时,它说不能从静态上下文引用非静态方法。我试图使用assertEquals查看它是否使用assertEquals***,Rating.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), "***"))