0

We have to test class, see below. Our question is how can we fill the dependencies, so that we can test the original class you see below.

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;
    }

}
tkruse
  • 10,222
  • 7
  • 53
  • 80
Dean James
  • 21
  • 6
  • You need to use Mockito – Limmy May 20 '19 at 11:09
  • Thank you but, how can we use it? So which code do we need, to make the test? – Dean James May 20 '19 at 14:12
  • Can you show your existing test class code please? – mrkernelpanic May 20 '19 at 14:26
  • package de.econsuite.wartung.webapp.components.benutzer; import org.junit.Test; import de.econsuite.wartung.webapp.WebTestBase; import de.econsuite.wartung.webapp.model.Benutzer; import de.econsuite.wartung.webapp.pages.benutzer.BenutzerPage; public class FragenAntwortenDataproviderTest extends WebTestBase { @Test public void Testing() { BenutzerPage page = new BenutzerPage(); tester.startPage(page); tester.assertRenderedPage(BenutzerPage.class); } } – Dean James May 20 '19 at 14:38
  • @mrkernelpanic thank you, above is our code. – Dean James May 20 '19 at 14:38
  • 2
    Please edit your question and paste the code into it. – mrkernelpanic May 20 '19 at 14:50
  • Paste the Junit test class you have created so far using Mockito, and then point out where you are stuck. – tkruse May 21 '19 at 01:40
  • Also please first read existing answers such as https://stackoverflow.com/questions/34497046, https://stackoverflow.com/questions/2457239, https://stackoverflow.com/questions/10906945, https://stackoverflow.com/questions/55134162. It seems your problem is not special compared to those other questions. – tkruse May 21 '19 at 01:46

2 Answers2

0

Since you use Spring you can use its ReflectionUtils helper class to inject the dependency:

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

Another option is to introduce package-private setter for service field and avoid using reflection.

martin-g
  • 17,243
  • 2
  • 23
  • 35
0

You should have your original class have the dependencies injected with @Autowired or @Inject. Actually you should not use field injection, but constructor injection. Then you should use the @ExtendWith(MockitoExtension.class) for the JUnit 5 test class. Every dependency you have to define as a @Mock and for the class you wish to test you use the @InjectMocks annotation.

This is the constructor injection to use:

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
}

And this is then a test-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);
    }
}
Sven
  • 2,343
  • 1
  • 18
  • 29