2015-11-27 6 views
1

У меня есть вопрос, связанный с каркасом Mockito. Есть ли какой-либо путь к мокетному полю внутри класса? Допустим, у нас есть:Mockito- mock field в классе

@Component 
public class A{ 

@Autowired 
B b; 

public methodExample(){ b.doSth();} 
} 


public class C{ 

@Autowired 
A a; 
@Test 
public void testMethodExample(){ 
...} 
} 

Есть ли возможность издеваться объект B, чтобы наложить возвращаемое значение метода doSth? Я знаю, что могу передать насмешливый объект в качестве аргумента конструктора, но мне интересно, есть ли другой вариант?

+0

Это именно то, для чего предназначена аннотация @InjectMocks. Виллиан получил это право! –

ответ

1

Вы можете предоставить защищенный сеттер только для тестирования и иметь структуру тестового пакета, отражающую структуру пакета вашего основного кода.

Или вы можете использовать расширение Powermock для измельчения частных/защищенных полей по мере необходимости.

См

https://code.google.com/p/powermock/wiki/BypassEncapsulation

@Test 
public void testDoSomething(){ 
    A a = new A(); 
    B mockedB = //create a mock; 

    Whitebox.setInternalState(a, "b", mockedB); 
} 
3

Вы можете посмотреть на @InjectMocks. С помощью этой аннотации Mockito попытается присвоить mocks через конструктор, свойство и поле, соответственно, останавливаясь при первом подходе, который преуспевает. Таким образом, тестовый модуль для сценария может выглядеть следующим образом:

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.runners.MockitoJUnitRunner; 

@RunWith(MockitoJUnitRunner.class) 
public class c 
{ 

    @InjectMocks 
    A a; 

    @Mock 
    B b; 

    @Test 
    public void testMethodExample() 
    { 
     a.methodExample(); 
    } 
} 

Некоторые моменты стоит некоторое внимание:

  • @InjectMocks будет принимать во внимание только полей с аннотацией @Mock
  • Это необходимо используйте MockitoJUnitRunner ИЛИ позвоните org.mockito.MockitoAnnotations.initMocks(this);, чтобы создать и ввести свои издевательства.