2012-04-04 14 views
5

Używam EasyMock do tworzenia makiety, która jest jednym z prywatnych parametrów (bez ustawiania) w testowanej klasie. Próbowałem użyć odbicia - ale to nie działa poprawnie.Jak wstrzyknąć EasyMock do testowanego prywatnego pola klasy

public class TestedClassTest{ 
    @Test 
    public void test(){ 
     TestedClass instance = new TestedClass(); 
     MockedClass mocked = EasyMock.createMock(MockedClass.class); 
     Data data = new Data(); 

     //Void setter 
     DataType dataType = (myDataType.DataType) EasyMock.anyObject(); 
     mocked.setDataType(dataType); 
     EasyMock.expectLastCall(); 

     //expect 
     EasyMock.expect(mocked.getData()).andReturn(data); 
     EasyMock.replay(mocked); 

     Field field = instance.getClass().getDeclaredField("mockedClass") 
     field.setAccessible(true); 
     field.set(instance, mocked); 

     //run tested method 
     instance.someAction(); 

     EasyMock.verify(mocked); 
    } 
} 

Im uzyskiwanie FAILED info:

Unexpected method call MockedClass.setDataType([email protected]): 
MockedClass.getData(): expected: 1, actual: 0 
junit.framework.AssertionFailedError: 
Unexpected method call MockedClass.setDataType([email protected]): 
MockedClass.getData(): expected: 1, actual: 0 

Im na pewno metoda ta jest wypalana na "MockedClass" obiektu w trakcie badanego "instance.someAction()"

Jak rozwiązać ten problem?

Zmieniano - Odpowiedź: po skorygowaniu podwoiła replay.mocked() znalazłem (tak prosty!), Że jeden więcej void metoda powinna zostać uznana za pomocą EasyMock.expectLastCall()

Odpowiedz

3

kodzie odbicie wygląda dobrze.

Minęło dużo czasu, odkąd użyłem EasyMock, ale czy nie można go nazwać tylko raz na próbę w teście? Dzwonisz dwa razy. Spróbuj pozbyć się pierwszego połączenia replay.

Czy w takim przypadku dobrze jest, aby pole zawierające próbę było publiczne? Ogólnie rzecz biorąc, współpracownicy powinni być ustawieni za pomocą konstruktora lub setera, eliminując w ogóle potrzebę refleksji.

EDYCJA - w oparciu o Twoje aktualizacje - błąd wskazuje, że na symulatorze wywołano setDataType, ale nie można się było spodziewać, że zostanie wywołana. Być może twoja klasa nazywa to dwa razy, być może jest wywoływana nieczynnie, lub nazywając ją argumentem, którego się nie spodziewałeś (chociaż spodziewałbym się, że błąd będzie inny w tym przypadku).

+0

Poprawiono i nadal ma podobny problem – Marcin

+0

r Czy błąd jest taki sam? – hvgotcodes

+0

edytowany kod i błąd, thx! – Marcin

Powiązane problemy