2016-01-25 2 views
0

Как я могу ввести издевательский компонент, который имеет определенное поведение, определенное в класс, который находится под тестированием, но когда он инициирует вызовы конструктора, которые имитируют и выполняют определенные действия против него.Inject mock bean в тестируемый объект

Так, например, у меня есть этот класс, который я хотел бы проверить:

public class A { 

    @Autowired 
    private B b; 

    private String result = null; 

    public A(int c) { 
     result = b.calculateStuff(c) + "AA"; 
    } 

    public String getResult() { 
     return result + "A"; 
    } 
} 

Now the test class: 


public class ATest{ 

    @Mock 
    private B b; 

    @InjectMocks 
    private A a; 

    @Before 
    public void setUp() { 
     doReturn("String result!").when(B).get(anyInt()); 
     MockitoAnnotations.initMocks(this); 
    } 

    public void testGetResult() { 
     assertEquals(a.getResult(),"String result!AAA"); 
    } 
} 

Как я могу на самом деле впрыснуть макет в А? Есть ли лучший способ приблизиться к этому?

ответ

1

Я предполагаю, что если вы вводите bean-компонент в свой класс A, тогда он должен быть singleton. Чего вы пытаетесь достичь, создав конструктор и передав ему аргумент? Если вы хотите что-то выполнить, как только будет создан компонент, я предлагаю вам заменить конструктор обычным методом и использовать на нем @PostConstruct. Пример:

@PostConstruct 
public void init() { 
     /* Do Something */ 
    } 

Вам нужно изменить некоторые вещи в случае, если вы хотите использовать тестирование Каркасы как Mockito до своего полного потенциала.

Сообщите мне, если я неправильно понял ваши требования.

+0

Вау - спасибо, я не знал, что есть такая аннотация. Это частично отвечает на мой вопрос - дело в том, что я хотел бы высмеять метод в классе B, который будет доступен в методе @PostContstruct. – karruma

+0

Ваши 'Injected Mocks' всегда будут доступны в' @ PostConstruct' :) Вот как я пишу большинство своих классов. Теперь, если вы счастливы, пожалуйста, примите ответ и помогите нам закрыть вопрос. – user2004685

2

В соответствии с documentation конструктор вашего объекта, находящегося под тестированием, должен соответствовать мокшам в тесте для инъекции. Итак, вам нужно перепроектировать ваш конструктор, чтобы это работало. int не может насмехаться.

В общем плане, вы должны попытаться сохранить свой Spring beansstateless, а это означает, что только разрешенный переменный класс и другие stateless beans (так что никаких String, int, другие литералов). Например:

public class A { 

    @Autowired 
    private B b; 

    public String getResult(int c) { 
     return b.calculateStuff(c) + "AAA"; 
    } 
} 

MockitoAnnotations.initMocks(this); должен быть первым вызовом в -annotated методом @Before.

Кроме того, у вас есть свои аргументы expected и actual неправильным способом.

+0

Нет ничего плохого в размещении 'MockitoAnnotations.initMocks (this);' statement в аннотированном методе '@ Before'. – user2004685

+0

Никогда не говорил, что было .. Просто, это должно быть первым вызовом в методе before. – Tobb

+0

ОК, это прекрасно - я это понимаю - но независимо от того, является ли он конструктором по умолчанию без переданных параметров, как я могу издеваться над определенным методом класса B, чтобы изделенный метод был доступен в конструкторе? – karruma