2013-11-28 2 views
108

Я использую Mockito в @Mock и @InjectMocks аннотаций впрыснуть зависимости в частные поля, которые помечаются в Spring @Autowired:Mockito: Вводим реальные объекты в частные @Autowired полого

@RunWith(MockitoJUnitRunner.class) 
public class DemoTest { 
    @Mock 
    private SomeService service; 

    @InjectMocks 
    private Demo demo; 

    /* ... */ 
} 

и

public class Demo { 

    @Autowired 
    private SomeService service; 

    /* ... */ 
} 

Теперь я хотел бы также ввести real объектов в частные @Autowired полей (без сеттеров). Возможно ли это или есть механизм, ограниченный только инъекцией Mocks?

+4

Обычно, когда вы насмехаетесь над вещами, это означает, что вы не очень заботитесь о конкретном объекте; что вы действительно заботитесь только о поведении осмеянного объекта. Возможно, вы хотите сделать интеграционный тест? Или, не могли бы вы объяснить, почему вы хотите, чтобы издевались и бетонные объекты жили вместе? – Makoto

+1

Ну, я имею дело с устаревшим кодом, и потребуется много времени (...). ThenReturn (...) для настройки макета только для предотвращения некоторых NPE и т. П. С другой стороны, реальный объект можно было бы безопасно использовать для этого. Поэтому было бы очень удобно иметь возможность вводить реальные объекты вместе с mocks. Даже если это может быть запах кода, я считаю это разумным в этом конкретном случае. – user2286693

+0

Не забывайте 'MockitoAnnotations.initMocks (this);' в методе '@ Before'. Я знаю, что это напрямую не связано с исходным вопросом, но для тех, кто придет позже, это нужно добавить, чтобы сделать это возможным. – Cuga

ответ

173

Использование @Spy аннотацию

@RunWith(MockitoJUnitRunner.class) 
public class DemoTest { 
    @Spy 
    private SomeService service = new RealServiceImpl(); 

    @InjectMocks 
    private Demo demo; 

    /* ... */ 
} 

Mockito будет рассматривать все поля, имеющие @Mock или @Spy аннотацию в качестве потенциальных кандидатов, который будет введен в экземпляр с аннотацией @InjectMocks аннотацию. В приведенном выше случае экземпляр «RealServiceImpl» получит впрыскивается в «демо»

Для получения более подробной информации см

http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#13 http://docs.mockito.googlecode.com/hg/latest/org/mockito/Spy.html

+3

+1: Работали для меня ... кроме объектов String. Mockito жалуется: 'Mockito не может издеваться/шпионить за: - заключительные классы - анонимные классы - примитивные типы' –

+0

Спасибо, это сработало для меня тоже :) Чтобы сделать прокси-использование mock else для реальной реализации, используйте spy –

+0

Спасибо! Вот именно то, что мне нужно! – nterry

12

В дополнение к @Dev гасятся ответ, если вы хотите использовать существующий боб, который был создан весной код может быть изменен на:

@RunWith(MockitoJUnitRunner.class) 
public class DemoTest { 

    @Inject 
    private ApplicationContext ctx; 

    @Spy 
    private SomeService service; 

    @InjectMocks 
    private Demo demo; 

    @Before 
    public void setUp(){ 
     service = ctx.getBean(SomeService.class); 
    } 

    /* ... */ 
} 

Таким образом, вы не должны изменить свой код (добавить другой конструктор) просто сделать тесты работы.

Смежные вопросы