2014-11-04 2 views
0

객체 계층의 어딘가에 호출되는 Mockito를 사용하여 객체를 모의 할 수 있습니까?Mockito : 호출 계층 구조의 모의 객체 - 연결 호출

의는 다음과 같은 클래스를 가정 해 봅시다 : 나는 getDatabaseSalary()의 반환 값을 대체 할 수 있도록

단위 테스트에서
@Component 
Class A 
    @Autowired B b 

    method obtainSalaryA() 
     calls b.calculateSalary() 

@Component 
Class B 
    @Autowired C c 

    method calculateSalary() 
     calls c.getDatabaseSalary() 

@Component 
Class C 

    getDatabaseSalary() 

, 나는, 같은 시간에 단위 테스트 방법 class A에서 obtainSalary하지만, 모의 C 싶습니다 이 메소드가 계층에서 호출 될 때.

답변

0

디자인을 일부 수정하면됩니다.

편집 : 귀하의 의견에 따라 통합 테스트를 진행하고 있습니다. 테스트 결과는 다음과 같습니다.

@Autowired 
private A a; 

@Autowired 
private B b; 

@Mock 
private C c; 

@Before 
public void setup() { 
    MockitoAnnotations.initMocks(this); 
} 

@Test 
public void test() { 
    b.setC(c); 
    when(c.getDatabaseSalary()).thenReturn(...); 
    a.obtainSalaryA(); 
} 
+0

고마워요. 귀하의 제안은 주로 테스트를 마친 클래스 A에 초점을두고, 다른 모든 종속성은 조롱을받습니다. A 및 B의 기능을 테스트해야하는 통합 테스트 일 때 어떻게 테스트 할 것인가? 예를 들어 C 클래스의 메소드는 테스트에서 생산에서보다 다른 반환 값을 제공해야합니까? 여기에 Spring의 ActiveProfiles를 사용하여 테스트에서 클래스 C의 다른 구현을 주입하고 모의 객체를 사용하지 않는 유일한 옵션은 무엇입니까? – Chris

+0

여전히 mock을 사용할 수 있습니다. 내 업데이트 답변을 참조하십시오. 지금 스프링 설정이 없으므로 작동하는지 알려주십시오. – Khalid

+0

나는 그것이 작동한다고 생각하지 않는다. Autowired는 Mockito 주석이 아니며 'a'는 null입니다. 통합 테스트가 의도 된 경우 질문을 변경해야합니다. –

0

저는 이것을 시도하지는 않았지만 작동하는지 또는 일부 변형인지 확인했습니다. 테스트에 그런

class YourTestClass { 

    @Mock(answer = Answers.RETURNS_SMART_NULLS) 
    C c; 

    @InjectMocks 
    B b; 

    @InjectMocks 
    A a; 
} 

는 c.getDatabaseSalary 방법에 대한 when..thenReturn을한다.

Difference between @Mock and @InjectMocks도 참조하십시오.

1

실제로 'a'를 테스트하면 'b'를 조롱하고 b에서 원하는 것을 되돌릴 수 있습니다. 그리고 만약 당신이 'b'시험을한다면 당신은 'c'를 조롱합니다. 종속성없이 항상 테스트 해보십시오 (단위 테스트)

@RunWith(MockitoJUnitRunner.class) 
public class ClinicServiceImplTests { 
    @Mock private B b; 
    @InjectMocks private A a; 


    @Before 
    public void setUp() throws Exception { 
     doReturn(...).when(b).someMethod(); 
    } 
} 
관련 문제