2015-08-27 4 views
1

У меня есть ниже класса Test:Фиктивные объекты возвращает нуль

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = SpringTestConfig.class) 
public class UserServiceTest { 

    @Inject 
    private UserRepository userRepository; 

    @Inject 
    private UserService userService; 

    @Test 
    public void testProcessInvoice() throws SQLException { 
     User user = new User(); 
     user.setFirstName("abc"); 
     when(userRepository.save(any(User.class))).thenReturn(user); 
     Assert.assertNotNull(userService); 
     User savedUser = userService.save(user); 
     Assert.assertEquals("abc", savedUser.getFirstName()); 
    } 
} 

У меня есть ниже SpringTestConfig.java

@Configuration 
public class SpringTestConfig { 
    @Bean 
    public UserService userService() { 
     return Mockito.mock(UserService.class); 
    } 
    @Bean 
    public UserRepository userRepository() { 
     return Mockito.mock(UserRepository.class); 
    } 
} 

вызов к User savedUser = userService.save(user); возвращает null объекта пользователя. Я не могу понять, почему он возвращает null.

EDIT: UserRepository является JpaRepository, если это проблема

public interface UserRepository extends JpaRepository<User, Long> { 
} 

ответ

2

Ваша конфигурация должна возвращать реальный UserService:

@Configuration 
public class SpringTestConfig { 
    @Bean 
    public UserService userService() { 
     return new UserServiceImpl(); // or whatever your implementation is 
    } 
    @Bean 
    public UserRepository userRepository() { 
     return Mockito.mock(UserRepository.class); 
    } 
} 

Mocks предназначены для сотрудников, а не за вещь, вы тестирования.

+0

Я следовал тому, что вы сказали, например 'return new UserServiceImpl (userRepository()),' now' userService.save (user) 'вызывает фактическую реализацию. Благодарю. –

4

Вашего UserService является фиктивным объектом, и не имеет определенное поведения для работы с методом #save(User).

Смещение объекта под испытаниями, вероятно, не является тем, что вы здесь. Я бы рекомендовал, чтобы тестируемые объекты были инстанцированы в тесте и инъецированы макетами или заглушками объектов, которые они используют.

+1

Да, правильно, поэтому я снова запустил с помощью 'when (userService.save (any (User.class))). ThenReturn (user);' и возвращает объект. как он проверяет функциональность 'userService.save', так как я определил насмешливое поведение на этом? –

+0

Вы не, если вы издеваетесь над своим объектом! –

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