Класс здания:
class Building(val name: String, val skill: String, @volatile var workHours: Int) {
var workers = new HashMap[Artisan, Int]()
def doWork(worker: Artisan): Boolean = {
...
workers.get(worker) match {
case Some(i: Int) =>
worker.cash += i
true
case None => false
}
...
}
Класс ремесленников:
class Artisan(val skill: String, city: City) extends Player(skill, city) {
var assignment = new Building("Empty", "", 0)
def doWork() {
if ( !assignment.doWork(this) )
...
}
def canEqual(other: Any): Boolean = other.isInstanceOf[Artisan]
override def equals(other: Any): Boolean = other match {
case that: Artisan =>
(that canEqual this) &&
assignment == that.assignment &&
skill == that.skill
case _ => false
}
override def hashCode(): Int = {
val state = Seq(assignment, skill)
state.map(_.hashCode()).foldLeft(0)((a, b) => 31 * a + b)
}
}
Прецедент:
@Test
def testIncome() {
val building = new Building("Bakery", "Builder", 10)
building.setSallery(100, player) // add player to building hashmap
player.assignment = building
player.doWork()
assertEquals("Should earn 100", player.cash, 100)
}
выход:
Negative test case
Я не понимаю, как этот код мог фактически обеспечить эту ошибку. Когда мой код должен просто возвращать false, если элемент не существует. При отладке программы в мою хэш-карту добавляется объект Artisan, поэтому я не понимаю, почему он не работает.
Artisan
класс? Вы используетеequals
, чтобы увидеть, находится ли рабочий ключ в наборе, но методapply
использует==
, который просто вызываетequals
, хотя, если вы переопределите его, это может вызвать проблемы. - person Noah   schedule 14.07.2014contains
, чтобы проверить, содержит лиMap
ключ, то есть!workers.contains(worker)
. - person wingedsubmariner   schedule 14.07.2014keySet.exists(_.equals(worker)))
. Разве это не даст тот же результат? - person miniwolf   schedule 14.07.2014Artisan
класс. Для меня это выглядит как несоответствие между вашими методамиequals
иhashCode
. - person Mario Camou   schedule 14.07.2014Artisan
есть переменные. Не уверен, насколько целесообразно использовать такой класс в качестве ключа (и почему это вообще возможно). Теоретически такие методы, какdoWork
, должны возвращать новый объект, а не изменять существующий и т. д. - person Ashalynd   schedule 14.07.2014