2014-01-27 38 views
3

我有以下服務:懲戒服務(JUnit的)範圍內的服務

@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

有幾種方法可以做到這一點。首先,最簡單的選擇是確保您的服務提供setEmailService(EmailService)方法。在這種情況下,您只需用自己的代替Spring注入的實現。

@Autowired 
private PlayerValidationService playerValidationService; 

@Mock 
private EmailService emailService; 

@Before 
public void setup() { 
    initMocks(this); 
    playerValidationService.setEmailService(emailService); 
} 

該方法的一個缺點是全面的EmailService實例很可能由Spring創建。假設你不希望發生這種情況,你可以使用'profiles'。

在您的測試包,創建一個配置類,這是隻有在特定的輪廓活躍:

@Configuration 
@Profile("mockemail") 
public class MockEmailConfig { 
    @Bean(name = "emailService") 
    public EmailService emailService() { 
     return new MyDummyEmailService(); 
    } 
} 

並添加註釋到您的測試,以激活該配置文件:

@ActiveProfiles({ "mockemail" }) 
public class PlayerValidationServiceTest { 
    //... 
} 
+0

謝謝您回覆,如果你不介意,我可以用其他方法做到這一點(簡而言之)... – Urbanleg

+0

這是2種不同的方法。你還想要什麼? ;)btw ...也可以選擇在src/test/java下放一個同名的類。你的'test'樹中的類和資源會覆蓋它們的'main'對應。 – Steve