Powiedzmy masz następujące klasy chciałbyś Test:Najlepsza praktyka - Ustawienie pola bez ustawiaczy w badanej jednostki
public class SomeService {
public String someMethod(SomeEntity someEntity) {
return someEntity.getSomeProperty();
}
}
SomeEntity wygląda następująco:
public class SomeEntity {
private String someProperty;
public getSomeProperty() {
return this.someProperty;
}
}
Twierdzenie chciałbyś zrobić:
String result = someService.someMethod(someEntity);
assertThat(result).isEqualTo("someValue");
Jak możesz sprawić, aby ten test zadziałał?
1) Dodaj setera dla "someProperty" w klasie SomeEntity. Nie wydaje mi się to dobrym rozwiązaniem, ponieważ nie zmieniasz kodu produkcyjnego, aby testy działały.
2) Użyj ReflectionUtils, aby ustawić wartość tego pola. Test będzie wyglądać następująco:
public class TestClass {
private SomeService someService;
@Test
public void testSomeProperty() {
SomeEntity someEntity = new SomeEntity();
ReflectionTestUtils.setField(someEntity, "someProperty", "someValue");
String result = someService.someMethod(someEntity);
assertThat(result).isEqualTo("someValue");
}
}
3) utworzyć klasę wewnętrzną w swojej klasie testowej, która rozszerza klasę SomeEntity i dodaje setter dla tej dziedzinie. Jednak aby to działało, musisz również zmienić klasę SomeEntity, ponieważ pole powinno stać się "chronione" zamiast "prywatne". Klasa testowa może wyglądać następująco:
public class TestClass {
private SomeService someService;
@Test
public void testSomeProperty() {
SomeEntityWithSetters someEntity = new SomeEntityTestWithSetters();
someEntity.setSomeProperty("someValue");
String result = someService.someMethod(someEntity);
assertThat(result).isEqualTo("someValue");
}
public class SomeEntityWithSetters extends SomeEntity {
public setSomeProperty(String someProperty) {
this.someProperty = someProperty;
}
}
}
4) Używasz Mockito do kpiny SomeEntity. Wydaje się być w porządku, jeśli potrzebujesz tylko wyśmiać tylko jedną właściwość w klasie, ale co, jeśli musisz wyśmiać jak 10 właściwości. Test może wyglądać następująco:
public class TestClass {
private SomeService someService;
@Test
public void testSomeProperty() {
SomeEntity someEntity = mock(SomeEntity.class);
when(someEntity.getSomeProperty()).thenReturn("someValue");
String result = someService.someMethod(someEntity);
assertThat(result).isEqualTo("someValue");
}
}
jeśli klasa ClassToTest doesent ma jakiegoś konstruktora lub setera .. jak w prod oni zapełniają nieruchomość .. ponownie z odbiciem? –
i domyślam się, że masz na sobie testową metodę SomeService, a nie Classtotest. jeśli to jest przypadek, możesz kpić z ClasstoTest. testowanie ClasstoTest będzie wykonane osobno i nie powinno się tam kpić z niego. –
W tym przypadku właściwość została ustawiona przez Hibernate, jest to baza danych Entity, Hibernate nie potrzebuje ustawiania, aby to zrobić. – wvp