В Mockito, @InjectMocks
не делает никакой магии. Он просто создает аннотированный System-Under-Test (SUT) в случае, если вы не создаете его самостоятельно, и вызывайте соответствующие сеттеры, чтобы вставлять mocks в SUT.
Вернитесь к своему коду, нет способа, с помощью которого Mockito может перейти, чтобы изменить поведение вашего private static final SomeUrl url = SomeService.get();
. Это просто ваш настоящий SomeService.get()
is null
.
Есть, конечно, способы обхода его (используя Powermock или другую насмешливую библиотеку, такую как JMockIt и т. Д.). Самая большая проблема здесь заключается в том, что ваш код не написан, чтобы его легко тестировать. Попробуйте сделать такой рефакторинг как:
- В таком случае не используйте
static
.
- Избегайте создания зависимостей (которые вам нужно высмеять) внутри SUT. Зависимости следует вводить.
Так что ваш код будет выглядеть
public class Manager {
private SomeUrl url;
public void setUrl(SomeUrl url) { this.url = url; }
public void method() {
doSomethingOnUrl(this.url.getUrlString());
}
}
@RunWith(MockitoJUnitRunner.class)
public class ManagerTest {
@InjectMocks
Manager manager = new Manager();
@Mock
SomeUrl mockUrl; // <- This is the mock that will be injected by Mockito
@Test
public void testMethod(){
// Given
when(mockUrl.getUrlString()).thenReturn("SomeUrl");
// When
manager.method();
// Then
verify(mockUrl, times(1)).getUrlString();
}
}
'частных статического URL = SomeService.get()' не имеет какой-либо тип данных. каков будет тип данных вашей переменной 'url'? – msagala25
Используя Mockito, вы будете обеспечивать насмешливое поведение при доступе к свойствам. В случае статических переменных вы можете использовать PowerMock. – Barath
@ LKTN.25, когда я отлаживаю код, SomeService.get(); вернет строку. Я полагаю, проблема в том, что она никогда не загружается. – c2340878