jMock - co oznacza zapisz {{}}

0

Witam
Czytałem właśnie objaśnienie na temat jMock i spotkałem się z takim ciekawym zapisem, którego nie rozumiem. Co oznacza taka konstrukcja?

returnsCachedObjectWithinTimeout() {
    context.checking(**new Expectations() {{
        oneOf (clock).time(); will(returnValue(loadTime));
        oneOf (clock).time(); will(returnValue(fetchTime));
            
        allowing (reloadPolicy).shouldReload(loadTime, fetchTime); will(returnValue(false));
        
        oneOf (loader).load(KEY); will(returnValue(VALUE));
    }}**);

normalnie bym powiedział, że new Expectations() {} tworzy anonima dziedziczącego po Expectations, ale co oznacza wówczas Class() {{cos tam cos tam cos tam}}?
Ni to nadpisanie, ni implementacja...

0

A jak zapiszesz to tak:

new JakasCLasa {
{
tutaj blod inicjalizujacy, mogacy wolac metody i takie tam
}

}

to powinno byc jasne? Dlatego wlasnie nie lubie miedzy innymi jmocka, korzysta z takich marnych trickow...

0

Lol, późno wczoraj było i zdawało mi się, że tego próbowałem, ale kompilator mi tego nie przepuszczał.
Tak czy owak, nie wiedziałem o takiej konstrukcji.
Tak właściwie to gdzie gdzie się znajduje blok inicjalizacji w definicji klasy?
Czy jest to coś w rodzaj bloku static{} - nie no to odpada bo stamtąd metod nie wywołam
Czy może kompilator niejawnie tworzy jakąś metodę foo() do której odwołanie wstawia pod koniec/na początek konstruktora superklasy określonego przez wywołanie?
czyli np:
new JFrame(){{setVisible(true);}}
utworzyłoby obiekt typu (niejawnie)

class anonimowyJFrame
{
  public anonimowyJFrame()
  {
     super();
     foo();
  }
  private foo()
{
   setVisible(true);
}
}

Czy jak to kurde działa?

EDIT: sun http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
Kurcze tyle siedzenia w Javie a ja takich podstaw nie znam ;P
Dzięki za wskazówkę
EDIT2:

The Java compiler copies initializer blocks into every constructor. Therefore, this approach can be used to share a block of code between multiple constructors.

oto i odpowiedź na moje pytanie. Byłem w sumie blisko ;P:P
Dziękówka

0

Mockito proste i bez tajemnic chyba ze potrzebujesz mokowania final to wtedy kiepsko

0

Zgadzam sie w 100%. Przy okazji dodam ze uzywam od 1.5 roku bardzo duzo testow pisze i jeszcze mnie nie zawiodl, final nie testowalem. Static czasami by sie przydalo jak pracuje z legacy deo (kod moich wspolpracownikow ;d).

0

Mockito (tak jak EasyMock) mają rozszerzenie PowerMock które rozwiązuje problemy z mockowaniem różnych dziwnych rzeczy ;) Można mockować static, final, mockować częściowo obiekty i wiele wiele innych :)

0

A mozesz to rozwinac? Z czego to czytalem, PoweMock owszem potrafi to robic, ale nie jest to rozszerzenie, tylko PowerMock 'mockuje' (hehe) API mockito, ale to jest ich wlasna implementacja, ktora dodaje pare funkcji. Z tego wynika, ze jesli Mockito 1.9.5. dodaje jakies funkcjonalnosci, to PoweMock, nie bedac rozszerzeniem, jeszcze ich nie ma w swoich API. Nie wiem czy jest to prawda, to tylko moje wlasne przemyslenia; jak mowie, nie mialem jeszcze potrzeby mockowanai staticow / final (po prostu unikam jak ognia, static bo jest bee ;d a final bo nie wierze w final - pare razy sie sparzylem w jakims frameworku open source / platnym, gdzie chcialem cos zrobic i sie nie dalo bo jakas metoda byla final, o zostalo tylko zastosowac metode Copiego-Pejsta).
Prosze o sprowstowanie, potwierdzenie, przyklady ;d

0

Ze strony:

Basically, PowerMock provides a class called "PowerMockito" for creating mock/object/class and initiating verification, and expecations, everything else you can still use Mockito to setup and verify expectation (e.g. times(), anyInt()).

All usages require @RunWith(PowerMockRunner.class) and @PrepareForTest annotated at class level.

Nigdy sie szczerze mówiąc nie zastanawiałem nad tym jak to wygląda od środka, bo korzyści z powermocka byłyby i tak większe niż potencjalne korzyści z nowej wersji easymocka (tym bardziej że z tego co widzę to powermock cały czas wspiera najnowsze wersje powermocka i easymocka)

0

Dokladnie, jest klasa PoweMockito ktora dubluje interfejs Mockito. Z API:
PowerMockito extends Mockito functionality with several new features such as mocking static and private methods and more. Use PowerMock instead of Mockito where applicable.
Czyli to nie jest rozszerzenie, to impostor ;d Nie wiem jak sie spisuje, nie uzywalem.

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