Конечно, вы можете использовать PowerMock для фокусировки только на этом методе. Например, с помощью PowerMockito конкретно, вы можете написать этот тест:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ServiceLayer.class})
public class PowerMockitoJan10Test {
private static final java.lang.String DESIRED_COUNTRY_VALUE = "USA";
@Test
public void testServiceLayerFindCountry() throws Exception {
ApiAdaptor mock = Mockito.mock(ApiAdaptor.class);
PowerMockito.whenNew(ApiAdaptor.class).withAnyArguments().thenReturn(mock);
Mockito.when(mock.getCountry(Mockito.anyString(), Mockito.anyString())).thenReturn(DESIRED_COUNTRY_VALUE);
String country = new ServiceLayer().findCountry(1);
Assert.assertEquals(DESIRED_COUNTRY_VALUE, country);
}
}
Если вы используете Spring, то, скорее всего, что вам нужно JUnit бегуна для этого тоже, так что вы можете использовать правило JUnit для PowerMockito вместо - see this example ,
Редактировать: это интересно. При использовании правила это не работает, если вы не добавите ServiceLayer.class
в список @PrepareForTest
. Я использовал последнюю версию PowerMockito на момент написания этой статьи, 1.6.4. Может быть, стоит сообщить. В любом случае, это то, как ваш тест будет работать с Spring:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("mycontext.xml")
@PrepareForTest({ApiAdaptor.class, ServiceLayer.class})
public class PowerMockitoJan10_WithRuleTest {
private static final String DESIRED_COUNTRY_VALUE = "USA";
@Rule
public PowerMockRule rule = new PowerMockRule();
@Test
public void testServiceLayerFindCountry() throws Exception {
PowerMockito.whenNew(ApiAdaptor.class).withNoArguments().thenReturn(new ApiAdaptor() {
@Override
public String getCountry(String latitude, String longitude) {
return DESIRED_COUNTRY_VALUE;
}
});
String country = new ServiceLayer().findCountry(1);
Assert.assertEquals(DESIRED_COUNTRY_VALUE, country);
}
}
Или, если переопределение является проблемой, вы можете издеваться ApiAdaptor
:
...
ApiAdaptor mock = PowerMockito.mock(ApiAdaptor.class);
PowerMockito.when(mock.getCountry(Mockito.anyString(), Mockito.anyString())).thenReturn(DESIRED_COUNTRY_VALUE);
PowerMockito.whenNew(ApiAdaptor.class).withNoArguments().thenReturn(mock);
...
Я делаю то же самое, но когда я запускаю тест, зашитый метод не вызывается, и законченный метод запускается ... :( – ishanbakshi
моя конфигурация аннотации выглядит примерно так: @RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration @PrepareForTes t ({ServiceLayer.class}) – ishanbakshi
Вы были правы, это не работает так, как при переключении на правило. Но я добавил «ServiceLayer.class» в список в аннотации, и теперь он работает хорошо. –