2012-08-23 14 views
6

Próbuję wyśmiewać połączenie z ostateczną metodą ResourceBundle.getString(). W przypadku PowerMock 1.4.12 i EasyMock 3.1 połączenie nie jest kpiną; zamiast tego wywoływana jest "prawdziwa" metoda.Kpiny z ostatniej metody z PowerMock + EasyMock

Moja klasa Test:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ResourceBundle.class) 
public class TestSuite { 
    @Before 
    public void setUp() throws Exception { 
     ResourceBundle resourceBundleMock = PowerMock.createNiceMock(ResourceBundle.class); 
     expect(resourceBundleMock.getString(BundleConstants.QUEUE)).andReturn("Queue"); 
     PowerMock.replay(resourceBundleMock); 

     beanBeingTested.setMessages(resourceBundleMock); 
    } 
    ... 
} 

kod w BeanBeingTested:

private ResourceBundle messages; 
... 
String label = messages.getString(BundleConstants.QUEUE); 

Komunikat o błędzie:

java.util.MissingResourceException: Can't find resource for bundle $java.util.ResourceBundle$$EnhancerByCGLIB$$e4a02557, key Queue 
at java.util.ResourceBundle.getObject(ResourceBundle.java:384) 
at java.util.ResourceBundle.getString(ResourceBundle.java:344) 
at com.yoyodyne.BeanBeingTested.setUpMenus(BeanBeingTested.java:87) 

Kiedy prześledzić przypadku testowego, debugger pokazuje typ beanBeingTested.messages jako "EasyMock dla klasy java.util.ResourceBundle", więc fałszywa jest wstrzykiwana corr ectly. (Nie ma również błędu podczas połączenia z numerem getString() w ramach połączenia expect() podczas konfiguracji).

z prostym mock zamiast ładnej makiety, pojawia się następujący błąd:

java.lang.AssertionError: 
    Unexpected method call handleGetObject("Queue"): 
    getString("Queue"): expected: 1, actual: 0 

Każdy pomysł co robię źle?

Dzięki.

Odpowiedz

0

Po co drwić przed wywołaniem pakietu zasobów? Ogólnie rzecz biorąc, staram się unikać szyderstwa orzechów i śrub java, takich jak ArrayList, Date itp. Pakiety zasobów (i MessageFormat.format()) w mniejszym lub większym stopniu należą do tej samej kategorii. Zwykle działają na łańcuchach, które są podstawami, a jeśli te rzeczy są zepsute lub zmieniają swoje zachowanie na tyle, by przerwać test, to zdecydowanie coś, co chcę wiedzieć :)

Po prostu pozwól im chwycić sznurki (co prawdopodobnie ma nastąpić ustawić w interfejsie użytkownika, być może po. Nie przejmuj się, aby sprawdzić wartość zwróconą, ponieważ nie chcesz, aby zmiany w pakiecie do złamania testu.Jeśli łańcuch zostanie ustawiony na pozorny składnik interfejsu użytkownika, To jest dobre miejsce dla anyObject (String.class), który poprawnie wyraża fakt, że ty (prawdopodobnie) nie interesujesz się konkretnym wyświetlanym ciągiem znaków:

Uważam to także za korzyść, gdy test kończy się niepowodzeniem z powodu braku klucza wiadomości. wiedzieć:

3

Utworzono instancję za pomocą narzędzia EasyMock. Zamiast tego, podczas pracy ze statycznymi metodami, musisz kpić z klasy (używając PowerMock).

Powinno to działać tak (testowane z EasyMock 3.0 i PowerMock 1,5, choć):

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ResourceBundle.class) 
public class TestSuite { 
    @Before 
    public void setUp() throws Exception { 
     // mock the class for one method only 
     PowerMock.mockStaticNice(ResourceBundle.class, "getString"); 

     // define mock-behaviour on the class, when calling the static method 
     expect(ResourceBundle.getString(BundleConstants.QUEUE)).andReturn("Queue"); 

     // start the engine 
     PowerMock.replayAll(); 
    } 
} 

(jestem świadomy to pytanie kilka miesięcy, ale może pomóc innym, choć)

+0

Mam również do czynienia z tym samym problemem.Ale to nadal nie pomaga. Czy odnosisz się tylko do metod ostatecznych lub statycznych? – Siddharth

+0

@Siddharth {{PowerMock.mockStaticNice()}} wyśmiewa jedną statyczną metodę klasy, pozostawiając resztę metod nietkniętą. Jeśli ten wątek Ci nie pomoże, powinieneś utworzyć nowe pytanie, ponieważ wydaje się, że masz inne problemy. – Andy

+0

Dzięki za odpowiedź @Andy. Ale temat tego wątku mówi o ostatecznej metodzie, ale mówisz o metodzie statycznej. Czy czegoś brakuje? Moim problemem jest to, że istnieje "publiczna, ostateczna próżnia", którą próbuję sfałszować, a test wywołuje rzeczywistą metodę zamiast próbować. Czy powyższy problem różni się od tego, o którym mówię? Przepraszam, jeśli przegapiłem jakiś punkt. – Siddharth

1

Spróbuj użyć:

@PrepareForTest({ResourceBundle.class, BeanBeingTested.class}) 

z tylko ResourceBundle w PrepareForTest makiety będzie działać, gdy nazywa się bezpośrednio z metody badania jednostkowych, lecz gdy wywołana z BeanBeingTested ty g et prawdziwą używaną metodą.

Brak dokumentacji Powermock w tym obszarze.

Powiązane problemy