Qui sono i miei requisiti per il test delle unità:Unit Testing - attuazione uguali solo per facilitare la prova
- Vorrei unità di testare le mie classi di produzione
- vorrei separare il codice di prova e il codice di produzione a parte, quali che posso rilasciare solo il codice di produzione
Questo sembra requisiti ragionevoli. Tuttavia, si verifica sempre un problema quando ho bisogno di utilizzare metodi come assertEquals
sugli oggetti in quanto ciò richiede che il metodo equals
sia sovrascritto. Il metodo equals
dovrebbe essere implementato nelle classi di produzione ma in realtà viene utilizzato solo per il test. Questo diventa ancora più grave quando le buone pratiche di codifica impongono che se si sostituisce equals
, allora anche hashCode
dovrebbe essere implementato con conseguente codice di produzione ancora più inutilizzato che ingombra le classi di produzione.
Ecco un semplice esempio con un modello di User
(IntelliJ autoimplemented equals
e hashCode
)
public class User
{
public long id;
public long companyId;
public String name;
public String email;
public long version;
@Override
public boolean equals(Object o)
{
if(this == o) return true;
if(o == null || getClass() != o.getClass()) return false;
User user = (User) o;
if(companyId != user.companyId) return false;
if(id != user.id) return false;
if(version != user.version) return false;
if(!email.equals(user.email)) return false;
if(!name.equals(user.name)) return false;
return true;
}
@Override
public int hashCode()
{
int result = (int) (id^(id >>> 32));
result = 31 * result + (int) (companyId^(companyId >>> 32));
result = 31 * result + name.hashCode();
result = 31 * result + email.hashCode();
result = 31 * result + (int) (version^(version >>> 32));
return result;
}
}
Come si può vedere, equals
e hashCode
occupa un sacco di spazio e ingombra la classe.
Una soluzione al problema potrebbe essere la creazione di una classe, UserTester
, che potrebbe avere un metodo assertUserEquals
che potrebbe essere utilizzato al posto di es. JUnit's assertEquals
.
Un'altra soluzione potrebbe essere quella di creare un UserComparator
. Tuttavia, non sembra che JUnit abbia uno assertEquals
che prende uno Comparator
.
Quali sono le migliori pratiche su questo punto?
Basta controllare la loro documentazione. Sembra che tu debba usare "assertReflectionEquals" invece di "assertEquals". Sembra che questa sia la soluzione al mio problema. – foens
Mio male, grazie per aver notato – Jk1
Ehh - Ho appena trovato un piccolo problema che non ho presentato nella mia domanda. Che dire dell'utilizzo di framework come [mockito] (https://code.google.com/p/mockito/) per il mocking? Quando si usano metodi come 'verify (userDeleter) .delete (user)', usa anche 'equals' per testare gli argomenti. Conosci qualche soluzione a questo problema? – foens