模拟对象返回null

时间:2015-08-27 15:09:47

标签: java spring mockito spring-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。

修改 UserRepositoryJpaRepository,如果这是一个问题

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

2 个答案:

答案 0 :(得分:4)

您的UserService是一个模拟对象,并且没有用于处理#save(User)方法的已定义行为。

模拟测试中的对象可能不是你在这里之后的样子。我建议您在测试中实例化您测试的对象,并注入他们使用的对象的模拟或存根。

答案 1 :(得分: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);
    }
}

模拟器适用于合作者,而不适用于您正在测试的事物。