2015-01-23 1 views
0

я должен проверить следующий класс, с autowired объекта:Инъекция издевается не работает с тем, когда пункты

public class Provider { 

    @Autowired 
    private Service service; 

    public Provider() {} 

    public Provider(final Service service) { 
     this.service = service; 
    } 

    // Other code here 

} 

Я создал тест следующим образом:

@RunWith(PowerMockRunner.class) 
public class ProviderTest { 

    @Mock(name="service") Service service; 
    @Mock Score score; 
    @InjectMocks Provider provider = new SearchResultProvider(); 

    @Before 
    public void setup() { 
     when(service.process()).thenReturn(score); 
    } 

    @Test 
    public void my_test() { 

     provider.execute(); // It fails, because service.process() returns null 

     // Other code here 
    } 

    // Other tests here 
} 

Однако, когда Я запускаю тест, он терпит неудачу. Все в порядке, кроме предложения, когда (...), который, кажется, игнорируется. Это приводит к сбою теста при вызове provider.execute(). Внутри этой функции выполняется вызов функции service.process(), после чего я ожидаю, что будет возвращен «макет». Но вместо этого возвращается нулевое значение.

Что я сделал не так?

+0

Вы делаете некоторые странные комбинации PowerMock и Mockito. Почему оба? Я думаю, что вы, возможно, захотите @RunWith (MockitoJunitRunner.class) не уверены –

+0

Да, это должно быть хорошо ... Powermockito нельзя использовать в одиночку. Я использую его на вершине Мокито. – user1883212

ответ

0

Образец кода не нуждается в powerermock, я полагаю, что есть PowerMock, потому что какой-то код final. Но тест не подготовить классы, которые будут дефинализированы.

Я полагаю код с окончательным методом является Service

public class Service { 
    public final Score process() { 
     throw new NullPointerException("lol"); 
    } 
} 

Тогда код не будет проходить, если тест не готовит классы быть definalized:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Service.class) 
public class ProviderTest { 
    ... 
}