2017-11-07 2 views
1

스프링이있는 두 개의 맵을 주입하는 클래스를 테스트해야합니다. 두지도를 모의하고 싶습니다. 다음과 같이 나는 모의 표기법을 사용클래스에서 두 개의 맵을 조롱합니다

@Mock 
private Map<String, Integer> map1; 

@Mock 
private Map<String, Date> map2; 

을하지만, 나는 다음과 같은 오류 얻을 :

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.util.Date 

첫 번째 조롱지도가 모두지도에 사용되는 것입니다.

내가 뭘 잘못하고 있니? 같은 인터페이스를 가진 두 개의 모의 객체를 삽입하려고하기 때문에

+0

작동 나를 위해. 모 키토 ver 1.10.19. 당신이 우리에게 보여주지 않을 것이 있습니까? – Michael

답변

0

은 아마 당신이 문제가

은 참조를 위해이 topic에서 두 번째 포스트에서 봐 주시기 바랍니다 (변수 이름은 예를 들어 속성과 일치하지 않습니다).

속성 설정 주입; 가짜는 먼저 속성 이름과 모의 이름이 일치하는 동일한 유형의 속성이 여러 개있는 경우 유형별로 해결됩니다.

+0

두 번째 게시물에서 recommanded처럼 "InjectMocks"표기법을 사용하는 대신 생성자를 사용하여 맵을 주입했습니다. 필자의 경우 InjectMocks가 작동하지 않는 이유를 정말로 모르겠습니다. –

1

mockito 두 필드의 유형이 동일하면 유형별 모의 삽입 방법을 알지 못합니다. 그래서 이름으로 주입하려고합니다. 이 경우 테스트중인 클래스의 필드 이름이 사용자가 만든 모의 객체와 일치하지 않는 것처럼 보입니다.

필드 주입; 여기 는 doc@InjectMocks입니다 가짜는 먼저 유형에 따라 해결됩니다 (이름에 관계없이 유형의 일치 주사가 발생하는 경우) 필드에 이름과 모의 이름이 일치하는 동일한 유형의 여러 속성이있는 경우.

당신은 당신의 신청의 이름을 바꾸거나 명시 적으로 모의 이름을 사용할 수 있습니다 :

@Mock(name="foo") 
private Map<String, Integer> map1; 

@Mock(name="bar") 
private Map<String, Date> map2; 

그러나 나는이 최선의 해결책이라고 생각하지 않습니다. 파일 이름의 이름이 바뀌면 false negative 테스트 결과를 얻습니다. 기능은 올바르게 작동하지만 테스트는 실패합니다.

나를 위해 최선의 해결책은 코드를 리팩터링하여 테스트 대상 클래스가 생성자의 종속성을 수신하도록하는 것입니다.그 후 당신은 이런 식으로 조롱 할 수도

@Mock 
private Map<String, Integer> map1; 

@Mock 
private Map<String, Date> map2; 

private ClassUnderTets cut; 

@Before 
public void setUp() throws Exception { 
    cut = new ClassUnderTets(map1, map2); 
} 

또는 :

@Mock 
private Map<String, Integer> map1; 

@Mock 
private Map<String, Date> map2; 

@InjectMocks 
private ClassUnderTets cut; 

를 문서에서 언급 한 바와 같이 :

생성자 주입; 가장 큰 생성자가 선택, 다음 인수는

+0

도움을 주셔서 감사합니다. 이미 InjectMocks 표기법을 사용하고 있었지만 작동하지 않았습니다. 생성자의 종속성으로 바꿀 때 작동했습니다. –

0

대신 다음

@Mock 
private Map<String, Integer> map1; 

@Mock 
private Map<String, Date> map2; 

방금 ​​같은 행동을 조롱해야합니다

@Mock 
private Map map1; 

@Mock 
private Map map2; 

을 시도 테스트에 선언 모의 객체로 해결 :

when(map1).get("hello").thenReturn(25); 
when(map2).get("birthday").thenReturn(new Date(2000, 07, 24)); 
관련 문제