【问题标题】:how to inject two mockito object in single Implentaion class如何在单个 Implentaion 类中注入两个模拟对象
【发布时间】:2021-12-30 04:07:24
【问题描述】:

现在只有一个模拟工作正常。另一个返回空指针异常。 @Autowired 和 @Mock 都为 BCryptPasswordEncoder passwordEncoder 提供空指针;

我的测试课

@SpringBootTest
public class UserServiceTests {
    
    @Autowired
    BCryptPasswordEncoder passwordEncoder;
    
    @Mock
    private UserRepository userRepository;
    
    @InjectMocks
    private UserService userService =new UserServiceImpl();
    
    @BeforeEach
    void setUp() throws Exception{
        MockitoAnnotations.initMocks(this);
    }
}

我的实现类

【问题讨论】:

  • 显示更多关于你的测试类配置,例如它是一个@SpringBootTest 还是一个简单的模拟测试等等
  • 更新问题,立即查看
  • 请勿发布代码图片。将代码添加到问题中。谢谢!

标签: spring-boot junit mocking mockito junit5


【解决方案1】:

如果您想对UserServiceImpl 类进行单元测试,只需删除@SpringBootTest(这实际上是一个成熟的集成测试)。以下应按预期工作:

@ExtendWith(MockitoExtension.class)
public class UserServiceTests {
    
    @Mock
    BCryptPasswordEncoder passwordEncoder;
    
    @Mock
    private UserRepository userRepository;
    
    @InjectMocks
    private UserServiceImpl userService;

    // Your tests
}

【讨论】:

  • 这是junit 4,我用的是junit 5,
  • 更新到 JUnit 5。
【解决方案2】:

没有可以注入的BCryptPasswordEncoder 的默认实例。所以你不能自动接线。您应该在您的配置中或任何其他地方为此声明一个 Bean。
示例:

@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
    return new BCryptPasswordEncoder();
}

【讨论】:

  • 这个已经在我的配置类中了 @Bean public BCryptPasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); }
【解决方案3】:

这个为我工作


public class UserServiceTests {
    
    @InjectMocks
    private UserService userService = new UserServiceImpl();
    
    @Mock
    private UserRepository userRepository;
    
    @Mock
    BCryptPasswordEncoder passwordEncoder;
    
    @BeforeEach
    void setUp() throws Exception{
        MockitoAnnotations.initMocks(this);
    }
}

【讨论】:

  • 为什么要使用@SpringBootTest 然后模拟一切?这对我来说毫无意义。
  • 嗯好的,马上更新
【解决方案4】:

此代码可能适合您。在这种情况下,您不能使用 @Autowire。现在,你不需要模拟BCryptPasswordEncoder的功能了

public class UserServiceTests {
    
    @InjectMocks
    private UserService userService;
    
    @Mock
    private UserRepository userRepository;
    
    @Spy
    BCryptPasswordEncoder passwordEncoder;
    
    @BeforeEach
    void setUp() throws Exception{
        passwordEncoder = new BCryptPasswordEncoder();
        MockitoAnnotations.initMocks(this);
    }
}

【讨论】:

    猜你喜欢
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多