2

다음과 같은 문제가 발생합니다. 스프링 부트 테스트가 있습니다. 여기에 mongoDbChannel 빈을 주입하고 스파이를가합니다. 그런 다음 정상적인 작업 흐름을 시작하고 send 메서드가 해당 bean에 대해 호출되는지 확인합니다. 확인 중에 @SpyBean 및 Mockito.any()

@RunWith(SpringRunner.class) 
@SpringBootTest(classes = {MongoAsBackupConfig.class}, 
     properties = {}, 
     webEnvironment = SpringBootTest.WebEnvironment.NONE) 
public class MongoAsBackupConfigTest { 
    @SpyBean(name = "mongoDbChannel") 
    private QueueChannel mongoDbChannel; 

    @Autowired 
    private DirectChannel mongoDbWithFailoverChannel; 

    @DirtiesContext 
    @Test 
    public void shouldUseFallbackForFullQueue() throws InterruptedException { 
     IntStream.rangeClosed(1, BACKUP_QUEUE_CAPACITY + OVERFILLING_CLICK_COUNT).forEach(someNumber -> 
      mongoDbWithFailoverChannel.send(MessageBuilder.withPayload(createPayload(someNumber)).build())); 
     verify(mongoDbChannel, times(BACKUP_QUEUE_CAPACITY)).send(Mockito.any()); 
    } 
} 

은 결과, 나는 any 콘크리트 매개 변수 값에 일치하지 않는 오류 메시지가 표시됩니다. 그러나 일반적으로 any은 param의 모든 값을 의미합니다. 여기서 무엇이 잘못 되었습니까?

Argument(s) are different! Wanted: 
mongoDbChannel.send(
    <any> 
); 
-> at MongoAsBackupConfigTest.shouldUseFallbackForFullQueue(MongoAsBackupConfigTest.java:67) 
Actual invocation has different arguments: 
mongoDbChannel.send(
    GenericMessage [payload=Click(...), headers={id=0eaa2317-b1b5-604d-65c5-78da521cd585, timestamp=1509085945379}], 
    10 
); 
-> at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115) 

편집 : 나는 자바 (8)을 사용하고 그리고 난 any(GenericMessage.class), any(Message.class)을 사용하려고하지만 동일한 효과했다.

답변

2

Mockito.any()을 사용할 때 컴파일러는 send 메서드의 서명에있는 매개 변수 유형을 기반으로 사용해야하는 형식을 유추 할 것이라는 것을 의미하는 Java 8을 사용한다고 가정합니다. 보인다

메소드 정의를 기반으로 Message 할 수 : 무엇을 실제로 전달하는 GenericMessage의 인스턴스 send(Message<?> message)

. 다음과 같이

내가 GenericMessageMessage 확장 가정으로, 당신은 당신 verify을 쓸 수 있습니다 :

verify(mongoDbChannel, times(BACKUP_QUEUE_CAPACITY)) 
    .send(Mockito.any(GenericMessage.class)); 

업데이트

는 오버로드 방법 send(Message<?> message, long timeout)있는 것으로 보인다. 어쩌면이 버전이 단일 인수 대신 호출됩니다.

+0

예 java입니다. 8. 불행히도 제안서가 동일한 오류 메시지와 함께 작동하지 않습니다. 나는 any (Message.class)도 시도했다. –

+2

아마도 2 args 버전이 실제로 호출됩니다 .. –

+0

예, 그렇습니다! 오류 메시지'send ( GenericMessage [],)에 표시됩니다. '이제 작동합니다. –