【问题标题】:Mock objects returns null模拟对象返回 null
【发布时间】:2015-08-27 15:09:47
【问题描述】:

我有以下测试类:

@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> {
}

【问题讨论】:

    标签: java spring mockito spring-test


    【解决方案1】:

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

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

    【讨论】:

    • 是的,正确,所以我再次使用when(userService.save(any(User.class))).thenReturn(user); 运行它并返回对象。既然我已经定义了模拟行为,它如何测试userService.save 的功能?
    • 如果你在模拟你的被测对象,你就不是!
    【解决方案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);
        }
    }
    

    模拟是为合作者准备的,而不是为你正在测试的东西。

    【讨论】:

    • 我已经按照你说的做了,比如return new UserServiceImpl(userRepository()); 现在userService.save(user) 调用实际实现。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多