Как смоделировать зависимости Spring с помощью JUnit 5? - PullRequest
0 голосов
/ 20 мая 2019

Мы должны проверить класс, см. Ниже.Наш вопрос заключается в том, как мы можем заполнить зависимости, чтобы мы могли проверить исходный класс, который вы видите ниже.

public class FragenAntwortenDataprovider extends SortableDataProvider<FragenAntworten, String> {

    @SpringBean
    private IFragenAntwortenService service;

    private IModel<FragenAntworten> filter;


    public FragenAntwortenDataprovider(IModel<FragenAntworten> filter){
        this.filter = filter;
        Injector.get().inject(this);
        setSort("id", SortOrder.DESCENDING);  // absteigend sortieren
    }


    @Override
    public Iterator<? extends FragenAntworten> iterator(long first, long count){
        List<FragenAntworten> list = load();
        List<FragenAntworten> sublist = list.subList((int) first, (int) (first+count));
        return sublist.iterator();
    }

    @Override
    public long size() {return getListSize();}

    @Override
    public IModel<FragenAntworten> model(FragenAntworten object) {
        return Model.of(object);
    }

    private void sort(final List<FragenAntworten> list){

    }

    private long getListSize(){
        List<FragenAntworten> list = service.ladeAlle(filter.getObject().getSystem());
        return list.size();
    }


    private List<FragenAntworten> load(){
        List<FragenAntworten> list = service.ladeAlle(filter.getObject().getSystem());
        return list;
    }

}

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

В вашем исходном классе должны быть зависимости добавлены с @Autowired или @Inject. На самом деле вы должны использовать не инъекцию поля, а конструктор. Затем вы должны использовать @ExtendWith(MockitoExtension.class) для тестового класса JUnit 5. Каждую зависимость, которую вы должны определить как @Mock, и для класса, который вы хотите проверить, вы используете аннотацию @InjectMocks.

Это инъекция конструктора для использования:

public class FragenAntwortenDataprovider extends SortableDataProvider<FragenAntworten, String> {

    private IFragenAntwortenService service;

    private IModel<FragenAntworten> filter;

    @Inject
    public FragenAntwortenDataprovider(IFragenAntwortenService service, IModel<FragenAntworten> filter){
        this.service = service;
        this.filter = filter;
        //I guess you don't need the injector anymore
        //Injector.get().inject(this);
        setSort("id", SortOrder.DESCENDING);  // absteigend sortieren
    }
    //Rest of class
}

И тогда это тестовый класс:

@ExtendWith(MockitoExtension.class)
public class testClass() {
    @Mock
    private IFragenAntwortenService service;

    @Mock
    private IModel<FragenAntworten> filter;

    @InjectMocks
    FragenAntwortenDataprovider sut; //System under Test

    @Test
    void test() {
        //Testcode
        // Control the mock with 
        when(service.anymethod()).thenReturn(result);

        var result = sut.callMethodToTest();

        // verify all calls
        verify(service, times(1)).anymethod();

        // and assert
        assertNotNull(result);
    }
}
0 голосов
/ 21 мая 2019

Поскольку вы используете Spring, вы можете использовать его вспомогательный класс ReflectionUtils для внедрения зависимости:

IFragenAntwortenService service = mock(IFragenAntwortenService.class);
IModel<FragenAntworten> model = ...;
FragenAntwortenDataprovider provider = new FragenAntwortenDataprovider(model);
Field serviceField = ReflectionUtils.findField("service", provider);
ReflectionUtils.setField(serviceField, provider, service);

Другой вариант - ввести частный установщик пакета для поля service и избегать использования отражения.

...