2016-07-16 2 views
0

Окружающая среда:Как придать Mocks в Спринг службы

Spring MVC 4

Junit

Mockito

Код:

Спринг службы при испытании:

@Service("abhishekService") 
public class AbhishekServiceImpl implements AbhisheskService { 

    @Autowired 
    private DaoOne daoOne; 
    @Autowired 
    private DaoTwo daoTwo; 
    @Autowired 
    private DaoThree daoThree; 
    @Autowired 
    private DaoFour daoThree; 

} 

JUnit Test:

public class AbhishekServiceImplTest { 

    @Mock 
    private DaoOne daoOne; 
    @Mock 
    private DaoTwo daoTwo; 
    @Mock 
    private DaoThree daoThree; 
    @Mock 
    private UserDao userDao; 

    private AbhisheskService abhisheskService; 

    @Before 
    public void setUp(){   

     MockitoAnnotations.initMocks(this); 
     abhisheskService = new AbhishekServiceImpl(); 

    } 

}

Издание:

1) Как показано на фрагменте кода один класс тестируемой использует четыре зависимостей.

2) Как показано на фрагменте кода два, в JUnit тест случае класса, все 4 зависимостей издевались с помощью @Mock

3) Мой вопрос: как эти четыре издевались объекты должны быть введены в тестовом классе?

4) Мой класс испытуемый не имеет конструктора/инъекцию сеттера, но инъекции поля с использованием @Autowired.

5) Я не хочу использовать @InjectMocks аннотацию из-за его опасного поведения as mentioned here

Может кто-нибудь, пожалуйста, руководство по этому поводу?

+0

Не могли бы вы реорганизовать службу, чтобы иметь инъекцию конструктора? Это простая вещь. – Magnilex

+0

В статье, в которой вы были связаны, уже содержится совет о том, как избежать проблемы - что еще вам нужно? – kryger

ответ

1

Вы пытаетесь протестировать класс, неправильно спроектированный для проверки поведения, то есть свойства недоступны для издевательства. AbhishekServiceImpl должен предоставить способ впрыскивать издевательства в класс. Если вы не можете получить доступ к полям, это явный пример неправильно разработанного класса. Учитывая, что AbhishekServiceImpl класса в унаследованном коде, и вы пытаетесь проверить поведение, то вы можете использовать отражение, чтобы вводить фиктивные объекты, как показано ниже:

DaoOne mockedDaoOne = mock(DaoOne.class); 
    when(mockedDaoOne.doSomething()).thenReturn("Mocked behaviour"); 

    AbhishekService abhishekService = new AbhishekServiceImpl(); 
    Field privateField = PrivateObject.class.getDeclaredField("daoOne"); 

    privateField.setAccessible(true); 

    privateField.set(abhishekService, mockedDaoOne); 

    assertEquals("Mocked behaviour", abhishekService.doSomething()); 

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

0

Вы можете пометить тест junit с помощью @RunWith (SpringJUnit4ClassRunner.class), а затем использовать @ContextConfiguration, чтобы определить контекст, который создает DAO и сервисы и соединяет их вместе.

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