unit testy i stubowanie wywołania metod wewnętrznych

0

Cześć, próbuję dopisać unit testy do kodu napisanego przez kogoś innego :/ i mam mały problem z mockami.
Mam coś mniej więcej takiego:


@Stateless
public class ABean implements A {


    @Resource
    private SessionContext context;


    // UPLOAD FILE AND PARSING

    @Override
    public Long methodX(final String name) {

        //do Something

        final String status = context.getBusinessObject(A.class).veryfied(name);

        //do Something
        final int id = context.getBusinessObject(A.class).initiate(name);
        final String result = context.getBusinessObject(A.class).doIt(id);
        //doSomething
        context.getBusinessObject(A.class).clean(id);

        return result;
    }


    @Override
    public String veryfied(final String name){
    //do Something
    }

    @Override
    public int initiate(final String name){
        //do Something
    }

    @Override
    public String doIt(final int id){
        //do Something
    }

    @Override
    public void clean(final String name){
        //do Something
    }
}


Napisałem mniej więcej coś takiego:

@RunWith(PowerMockRunner.class)
public class ABeanTest {

    @Mock
    private SessionContext sessionContext;

    @InjectMocks
    private ABean aBean = new aBean();

    @Test
    public void uploadFile() throws Exception {

        when(sessionContext.getBusinessObject(A.class)).thenReturn(new ABean());

        when(sessionContext.getBusinessObject(A.class).veryfied(anyString()).thenReturn(anyString());
        when(sessionContext.getBusinessObject(A.class).initiate(anyString())).thenReturn(anyInt()));
        when(sessionContext.getBusinessObject(A.class).doIt(anyInt()).thenReturn(anyString());
        doNothing().when(sessionContext.getBusinessObject(A.class)).clean(anyInt());


        aBean.methodX(testName);

        verify(sessionContext.getBusinessObject(A.class), atLeastOnce()).initiateParsing(anyString());
    }
}

Problem jest taki, że podczas odpalania testu leci nullPointer na lini when(sessionContext.getBusinessObject(A.class).veryfied(anyString()).thenReturn(anyString()); ponieważ chyba zaczyna wykonywać tą metodę, zamiast zwrócić anyString()
Nie wiem co robię źle :/

0
  1. radze nie uzywac Power Mockito ...
  2. nie naduzywac any() ....
  3. linia 'when(sessionContext.getBusinessObject(A.class)).thenReturn(new ABean());' wyglada ok. Zwracasz prawdziwy obiekt na ktorym wykona sie 'veryfied(name)'.

Ta linia jest nie potrzebna w ogóle:
when(sessionContext.getBusinessObject(A.class).verify(anyString()).thenReturn(anyString());
Po pierwsze to masz 'veryfied' a nie 'verify'.

0

ad. 1 Potrzebuję power mockito bo dodatkowo w metodzie, która jest testowana znajduje sie wywołanie metody statycznej którą muszę zamockować. Która linia jest nie potrzebna?

"Po pierwsze to masz 'veryfied' a nie 'verify'."

literówka podczas przepisywania do pytania.

Ta linia jest nie potrzebna w ogóle:
when(sessionContext.getBusinessObject(A.class).verify(anyString()).thenReturn(anyString());

Dlaczego jest nie potrzebna?
Z tego co wiem to jeden test unitowy powinien testowac logikę jednej metody. A nie wszystkich które ta metoda woła. Czyli powinienem zamockować wszystkie odpowiedzi z tych wewnętrznych metod które sa wołane przez methodX

0
  1. czy koniecznie potrzebujesz mockowac ta metode statyczna ... Moze pozwol jej sie wykonac. Osobiscie unikam mockow i mokuje, stabuje jezeli naprawde inaczej sie nie da albo bardzo przyspiesza to czas pisania testu. Jesli w projekcie widze ze ktos uzywa Power Mockito to jest to dla mnie znak ze kod jest napisany zle.
  2. w Twoim przykladzie jezeli chcesz uzywac mockow to

ABean abeanMock = Mockito.mock(ABean.class);
when(sessionContext.getBusinessObject(A.class).thenReturn(abeanMock);
when(abeanMock.veryfied("NAME").thenReturn("SOME STATUS");

Ja osobiscie to bym pewnie zrobil tylko when(sessionContext.getBusinessObject(A.class).thenReturn(new ABean()) i pozwolil wykonac sie metodzie 'verified'

1 użytkowników online, w tym zalogowanych: 0, gości: 1