我有以下服务:
@Service
public class PlayerValidationService {
@Autowire
private EmailService emailService;
public boolean validatePlayerEmail(Player player) {
return this.emailService.validateEmail(player.getEmail());
}
现在在我的junit测试类中,我正在使用另一个使用PlayerValidationService的第三服务:
public class junit {
@autowire PlayerAccountService playerAccountService ;
@Test
public test() {
this.playerAccountService .createAccount();
assertAllSortsOfThings();
}
使用基于注释的自动装配时,是否可以在PlayerAccountService中模拟EmailService? (例如,使模拟不通过我们使用的常规电子邮件提供商检查电子邮件的验证)
感谢。
答案 0 :(得分:1)
有几种方法可以做到这一点。首先,最简单的选择是确保您的服务提供setEmailService(EmailService)方法。在这种情况下,您只需用自己的实现替换Spring注入的实现。
@Autowired
private PlayerValidationService playerValidationService;
@Mock
private EmailService emailService;
@Before
public void setup() {
initMocks(this);
playerValidationService.setEmailService(emailService);
}
这种方法的一个缺点是Spring可能会创建一个完整的EmailService实例。假设您不希望发生这种情况,可以使用“个人资料”。
在测试包中,创建一个仅在特定配置文件中处于活动状态的配置类:
@Configuration
@Profile("mockemail")
public class MockEmailConfig {
@Bean(name = "emailService")
public EmailService emailService() {
return new MyDummyEmailService();
}
}
在测试中添加注释以激活该配置文件:
@ActiveProfiles({ "mockemail" })
public class PlayerValidationServiceTest {
//...
}