模拟对象 returns 空

Mock objects returns null

我有以下测试class:

@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); returns null 用户对象。我无法弄清楚为什么它返回 null。

编辑: UserRepositoryJpaRepository,如果这是一个问题

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

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

模拟被测对象可能不是您想要的。我会建议您的被测对象在测试中实例化,并注入它们使用的对象的模拟或存根。

您的配置需要 return 一个真正的 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 是为协作者准备的,而不是为你正在测试的东西准备的。