Pokazywanie postów oznaczonych etykietą mock. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą mock. Pokaż wszystkie posty

piątek, 2 grudnia 2011

Mockowanie konstruktorów

Gmock oferuje także bardzo przydatną funkcję mockowania konstruktorów. Jest to, co prawda pewnego rodzaju zły design, jeśli trzeba wykorzystać tą funkcjonalność, jednak jako że Groovy jest językiem dynamicznym i nie lubimy kodować niepotrzebnych fabryk, to taka funkcjonalność może być z powodzeniem wykorzystana. Dla przykładu podam kawałek kodu nad którym dzisiaj siedziałem. Musiałem skorzystać z generatora losowego, jednakże zależy mi w tym wypadku na wielowątkowości, więc musi być on tworzony dla każdego obiektu. Nie widzę sensu w tym przypadku, na tworzenie dodatkowej klasy fabryki dla typowego obiektu Java, więc zdecydowałem się na skorzystanie z mockowania konstruktora (kodu z wykorzystaniem generatora losowego z oczywistych względów nie można testować bez obiektów pozornych).
@Test
void shouldReturnDiscount2() {
  def mockRandom = mock(Random, constructor(anything()))
  mockRandom.nextInt(3).returns(2)
  play {returnValue = sut.getRandomActiveDiscount()}
}

I tak ten mały kawałek kodu mi to umożliwił. W tym przypadku mockuję konstruktor klasy Random, do którego przekazywany jest jakikolwiek parametr. Konstruktor ten zwróci mi obiekt mockRandom, na którym mogę wykonywać dalsze potrzebne mi operacje.

środa, 16 listopada 2011

Partial Mock

Partial mock jest to sposób na "udawanie" tylko niektórych metod z obiektu. W ten sposób, gdy chcemy aby obiekt działał normalnie, a chcemy w jakimś celu skorzystać z funkcjonalności frameworka do obiektów pozornych możemy to uczynić.

W Grailsach jest to przydatne narzędzie, ponieważ często używane są dynamicznie wstrzykiwane metody (np. do kontrolerów) do których nie mamy dostępu w środowisku testowym, a z których korzysta kod.

Poniższy przykład demonstruje użycie partial mock we frameworku gmock:

def controller = new SomeController()
def mockRequest = mock()
mockController.request.returns(mockRequest)

Dla instancji controller podmieniamy w tym przypadku właściwość request na nasz mockRequest. Jak widać składnia partial mock jest identyczna jak składnia przy typowych obiektach pozornych, więc skorzystanie z tej techniki będzie wyjątkowo łatwe.