Considere a seguinte classe PrizeDB que permite guardar a descrição de prémios que podem ser atribuídos aos utilizadores de um sistema:

public class PrizeDB {
// ...
// The ctor. If prize is null, then the it creates an empty PrizeDB, otherwise it creates a PrizeDB already with one prize 
public PrizeDB(Prize prize) { 
  // ...
}
// adds the given Prize p to the current set of prizes
public void add(Prize p) { 
//...
}
// removes the prize with the given ID from the current set of prizes
public void remove(int id) {
// ...
}
// changes the description of the prize with given id to description
public void change(int id, String description) {
// ...
}
// returns the prize with given id, null if no such prize
public Prize find(int id) {
// ...
}
// returns the current number of prizes
public int getNumberOfPrizes() {
// ...
}
// checks if there is already a prize with the given id
public boolean hasId(int id) {
// ....
}
}


A classe Prize descreve um prémio e tem como atributos uma descrição, um identificador, e um valor monetário. Do ponto de vista da classe PrizeDB, existem as seguintes restrições:

  • O número de prémios que são mantidos em qualquer momento é menor ou igual a 10;
  • A descrição de qualquer prémio tem que ser maior ou igual do que 10 caracteres e menor do que 100;
  • Não há dois prémios com o mesmo identificador
Qualquer violação de pelo menos uma destas restrições deve ser assinalada lançando a excepção InvalidInvocationException e o seu efeito deve ser anulado. Aplicando o padrão de teste ao nível de classe correcto, concretize todos os casos de teste utilizando a framework de testes TestNG.