我在方法中的部分上面的注释中解释了我想要做的事情:
public int addPatron(String name) throws PatronException {
int i = 0;
//1. Iterate through a hashmap, and confirm the new name I am trying to add to the record doesn't already exist in the hashmap
for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) {
Patron nameTest = entry.getValue();
//2. If the name I am trying to add already exists, we want to throw an exception saying as much.
if (nameTest.getName() == name) {
throw new PatronException ("This patron already exists");
//3. If the name is unique, we want to get the largest key value (customer number) already in the hash, an increment by one.
} else if (nameTest.getName() != name) {
Map.Entry<Integer,Patron> maxEntry = null;
for(Map.Entry<Integer, Patron> entryCheck : patrons.entrySet()) {
if (maxEntry == null || entryCheck.getKey() > maxEntry.getKey()) {
maxEntry = entryCheck;
i = maxEntry.getKey();
i++;
}
}
} else {
throw new PatronException("Something's not working!");
}
//4. If everything is ok up to this point, we want to us the name and the new customer id number, and use those to create a new Patron object, which then gets added to a hashmap for this class which contains all the patrons.
Patron newPatron = new Patron(name, i);
patrons.put(i, newPatron);
}
return i;
}
当我尝试运行一个简单的单元测试时,如果我连续两次成功为addPatron添加相同的名称,测试将失败。
try {
testLibrary.addPatron("Dude");
testLibrary.addPatron("Dude");
fail("This shouldn't have worked");
测试失败,告诉我addPatron方法能够使用相同的名称两次。
@Jon Skeet:
My Patron课程如下:
public class Patron {
//attributes
private String name = null;
private int cardNumber = 0;
//operations
public Patron (String name, int cardNumber){
this.name = name;
this.cardNumber = cardNumber;
}
public String getName(){
return name;
}
public int getCardNumber(){
return cardNumber;
}
}
答案 0 :(得分:2)
正如其他人所说,使用==
来比较字符串几乎肯定是不合适的。但是,它实际上不应该在您的测试用例中引起问题,因为您使用相同的常量字符串两次,因此==
应该有效。当然,您仍应修复代码以使用equals
。
还不清楚Patron
构造函数或getName
方法的作用 - 这些方法中的任何一个都可能导致问题(例如,如果他们创建新的字符串副本 - 这会导致你的测试失败,但通常也是不必要的。)
对我来说更令我担忧的是这条评论:
// 3. If the name is unique, we want to get the largest key value (customer number)
// already in the hash, an increment by one.
此评论在主循环中。因此,到那时我们不知道名称是唯一的 - 我们只知道它与此迭代中的顾客名称不匹配。
更令人担心的是 - 我只是注意到了这一点 - 你也在迭代块中执行了添加 。在我看来,你应该有更多这样的东西:
public int addPatron(String name) throws PatronException {
int maxKey = -1;
for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) {
if (entry.getValue().getName().equals(name)) {
// TODO: Consider using IllegalArgumentException
throw new PatronException("This patron already exists");
}
maxKey = Math.max(maxKey, entry.getKey());
}
int newKey = maxKey + 1;
Patron newPatron = new Patron(name, newKey);
patrons.put(newKey, newPatron);
return newKey;
}
此外,听起来像真的你想要一张从名字到赞助人的地图,可能还有id到顾客地图。
答案 1 :(得分:0)
您需要使用equals来比较java中的String对象,而不是==。所以替换:
if (nameTest.getName() == name) {
使用:
if (nameTest.getName().equals(name)) {
答案 2 :(得分:0)
尝试使用
nameTest.getName().equals(name)
而不是
nameTest.getName() == name
因为现在你要比较引用而不是字符串的值。 it's explained here
重新审视您的代码
我再看看你的代码,问题是,你的HashMap在测试开始时是空的。所以循环永远不会被运行==&gt;永远不会有赞助人加入或抛出异常。
答案 3 :(得分:-1)