Вместо кода, который вызывает new JPAQuery<>(entityManager);
, вы можете подключить интерфейс, который предоставляет JPAQuery
. Затем вы можете имитировать этот интерфейс, поэтому предоставленный JPAQuery является имитацией, управляемой вашим тестом.
вот пример того, как интерфейс предоставляет новый объект:
@RequiredArgsConstructor
public static class NewObject {
private final Map<String, Integer> entries; //Equivalent of EntityManager in example above
private final Function<Map<String, Integer>, Map<String, Integer>> mapSupplier; // new dependency, which supplies the new object to be mocked
public Integer getKeyForValue(String key) {
//rather than calling myMap = new HashMap<>(entries) use the method call
//equivalent replacement of: JPAQuery<ApplicationApprovals> query = new JPAQuery<>(entityManager)
Map<String, Integer> myMap = mapSupplier.apply(entries);
return myMap.get(key);
}
}
затем в вашем test, вы можете вставить альтернативную реализацию интерфейса, позволяющую создать имитацию объекта, которым вы хотите управлять:
@Test
public void valueReturnedFromNewObjectIsFromSuppliedMap() {
//create a mock which will provide your new object
Function<Map<String, Integer>, Map<String, Integer>> mockMapSupplier = mock(Function.class);
//set up the object you want the mock to return
Map<String, Integer> otherEntries = new HashMap<>();
Integer alternativeValue = 1000;
otherEntries.put(KEY, alternativeValue);
//using Mockito, tell the mock when to return your expected response
when(mockMapSupplier.apply(entries)).thenReturn(otherEntries);
//create the class you want to test using your mock
NewObject newObject = new NewObject(entries, mockMapSupplier);
//verify it behaves as expected
assertThat(newObject.getKeyForValue(KEY), is(alternativeValue));
}
В приведенных выше примерах используется Mockito (https://site.mockito.org) для предоставления фиктивных объектов, которыми можно управлять в модульном тесте. Если вы не знакомы с Mockito, я рекомендую посмотреть документацию и примеры, которые они предоставляют, чтобы понять, что он делает и как вы можете использовать его в тестах для проверки поведения вашего кода.