我试图创建一种方法,根据电影的评级输出一定数量的星星。我使用的是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;
}
答案 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), "***"))