2014-01-27 3 views
3

비웃음 나는 다음과 같은 서비스가 있습니다서비스 (JUnit을) 내에서 서비스

public class junit { 
@autowire PlayerAccountService playerAccountService ; 


@Test 
public test() { 
    this.playerAccountService .createAccount(); 
    assertAllSortsOfThings(); 
} 

인가 : 내가 PlayerValidationService를 사용하는 다른 3 서비스를 사용하고 내 JUnit 테스트 클래스 이제

@Service 
public class PlayerValidationService { 

@Autowire 
private EmailService emailService; 


public boolean validatePlayerEmail(Player player) { 
    return this.emailService.validateEmail(player.getEmail()); 

} 

을 어노테이션 기반 자동 와이어 링을 사용할 때 PlayerAccountService 내에서 EmailService를 조롱 할 수 있습니까? (예를 들어 우리가 함께 작업하는 일반 이메일 제공 업체를 통해 모의 검증을 확인하지 마십시오)

감사합니다.

답변

1

이렇게 할 수있는 몇 가지 방법이 있습니다. 가장 간단한 옵션은 서비스가 setEmailService (EmailService) 메소드를 제공하는지 확인하는 것입니다. 어떤 경우에는 Spring에 삽입 된 구현을 자신의 것으로 대체한다.

@Autowired 
private PlayerValidationService playerValidationService; 

@Mock 
private EmailService emailService; 

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

이 방법의 단점은 본격적인 EmailService의 인스턴스가 스프링에 의해 생성 될 가능성이 있다는 점이다. 당신이 그것을 원하지 않는다고 가정하면 '프로필'을 사용할 수 있습니다. 테스트 패키지에서

, 특정 프로필에만 활성화됩니다 구성 클래스 생성 :

@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

관련 문제