2015-09-04 4 views
0

У меня проблема с записью тестового теста Junit для проекта Spring. Его следующий метод;Испытание Junit в проекте Spring/Maven

boolean doesUserIdExist(String userId){ 
     if(userRepository.findOne(userId.toLowerCase()) != null) { 
      throw new userAlreadyExistsException("User with id: " + userId + " already exists") 
      return false; 
     }else{ 
      return true; 
     } 
    } 

Теперь в моем JUnit У меня есть что-то написано, как это ..:

void compareDuplicateUserIdTest(){ 

    UserService UserService = new UserService(); 

    String lowercase = "test"; 
    String uppercase = "Test"; 

    boolean result = userService.doesUserIdExist(lowercase); 

    //Check the boolean result if its true 

} 

Поскольку им с использованием метода findOne это означает, что я должен был бы проверить String = «тест» против DB userId = "test". Это не так, поскольку он должен работать автономно без каких-либо записей в базе данных MongoDB.

Теперь я читал о фреймворке, как mockito, чтобы проверить это, но разве это не слишком «слишком» для такой простой проверки метода? Могу ли я удалить часть findOne и просто сравнить строки?

ответ

2

Вы сталкиваетесь с очень распространенной проблемой для модульного тестирования, когда базы данных не должны быть задействованы (это будет интеграционное тестирование), поэтому ... здесь Mockito - отличный инструмент для использования.

Использование Mockito позволяет издеваться результаты базы данных и по-прежнему с регулярным потоком вашего метода, так что вы могли бы сделать что-то вроде этого:

import static org.junit.Assert.assertTrue; 
import static org.mockito.Mockito.when; 

@RunWith(MockitoJUnitRunner.class) 
public class UserService_doesUserIdExistTests 
{ 

    @Mock 
    private UserRepository userRepository; 

    @InjectMocks 
    private UserService userService; 

    @Test 
    void compareDuplicateUserIdTest() { 

     String lowercase = "test"; 

     // Mocking the response for your method that uses external dependencies 
     when(userRepository.findOne(lowercase)).thenReturn(true); // You can mock the response you want using .thenReturn(...) 

     // Test your userService method (you can also debug it if needed) 
     boolean result = userService.doesUserIdExist(lowercase); 

     //Check the boolean result if its true 
     assertTrue(result); 
    } 
} 

Я не проверял код, но показывает идею тестирования userService.doesUserIdExist(...) метод как единое целое. Также это очень полезно, когда вам нужно учиться, отлаживая код.

+0

Спасибо! Я начну читать в рамки mockito и внедряю это в проект. Пример, который вы предоставили, весьма полезен :) –

+0

@ dz3k рад помочь –

0

Нет, это не так много. Идея модульных тестов состоит в том, чтобы протестировать поведение метода на основе разных входных данных и обеспечить, чтобы он вел себя так, как ожидалось. Он также документирует ваши ожидания и делает рефакторинг гораздо менее болезненным.

Представьте, что в будущем кто-то (может быть, вы даже) решит удалить userRepository.findOne из doesUserExist. Ваш модульный тест завершится неудачей, и разработчик должен будет выяснить, нужно ли менять тесты из-за рафакторинга или рефакторинга.

Я даже не уверен, что вы будете тестировать, если вы удалите метод findOne и как вы планируете это делать.

Mockito и Spring сделать насмешливый очень простой. Все, что вам нужно сделать, это определить и инициировать mock userRepository, а затем определить поведение на основе ввода.

+0

Отличное объяснение, теория, лежащая в основе этого, дает больше информации о том, как работать с jUnit в проекте Spring. Спасибо :) –

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