Oto moje wymagania dla testów jednostkowych:Unit Testing - tylko realizacji wynosi ułatwić testowanie
- Chciałbym jednostki przetestować moje zajęcia produkcyjne
- Chciałbym oddzielić kod testowy i kod produkcyjny oprócz takich że mogę zwolnić kod produkcyjny tylko
To wydaje się rozsądne wymagania. Jednak zawsze pojawia się problem, gdy trzeba użyć metod takich jak assertEquals
dla obiektów, ponieważ wymagają one nadpisania metody equals
. Metoda equals
musiałaby zostać zaimplementowana w klasach produkcyjnych , ale w rzeczywistości jest używana tylko do testowania. Staje się to jeszcze gorsze, gdy dobre praktyki kodowania nakazują, że jeśli equals
zostanie przesłonięte, to należy również zaimplementować hashCode
, powodując jeszcze więcej nieużywanego kodu produkcyjnego, który zaśmierza klasy produkcyjne.
Oto prosty przykład z User
modelu (IntelliJ autoimplemented equals
i 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;
}
}
Jak można zauważyć, equals
i hashCode
zajmuje dużo miejsca i zaśmiecanie klasy.
Jednym z rozwiązań tego problemu może być stworzenie klasy, UserTester
, która mogłaby mieć metodę assertUserEquals
, która mogłaby zostać użyta zamiast np. JUnit's assertEquals
.
Innym rozwiązaniem może być utworzenie UserComparator
. Jednak wydaje się, że JUnit nie ma żadnego assertEquals
, który zajmuje Comparator
.
Jakie są najlepsze praktyki w tym zakresie?
Właśnie sprawdziłem ich dokumentację. Wydaje się, że powinieneś użyć 'assertReflectionEquals' zamiast' assertEquals'. Wydaje się, że jest to rozwiązanie mojego problemu. – foens
Mój zły, dzięki za zauważenie – Jk1
Ehh - Znalazłem mały problem, którego nie przedstawiłem na moim pytaniu. A co z używaniem frameworków takich jak [mockito] (https://code.google.com/p/mockito/) do kpiny? Używając metod takich jak 'verify (userDeleter) .delete (user)', używa również 'equals' do testowania argumentów. Czy znasz jakieś rozwiązanie tego problemu? – foens