在服务中模拟服务(JUnit)

时间:2014-01-27 15:45:22

标签: spring junit mocking mockito

我有以下服务:

@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? (例如,使模拟不通过我们使用的常规电子邮件提供商检查电子邮件的验证)

感谢。

1 个答案:

答案 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 {
    //...
}