2017-10-25 13 views
0

나는 테스트 할 필요가있는 다른 쓰레드에서 실행되는이 코드를 가지고있다.Java 8에서 fire-and-forget 요청을 테스트하려면 어떻게합니까?

여기 내 코드가 있습니다.

ExecutorService executor = Executors.newSingleThreadExecutor(); 
       executor.submit(() -> { 
        String partitionKey = format("partitionKey-%d", random.nextInt(10000)); 

        String pPpageViewStreamName = this.stormConf.get(pPAGEVIEW_STREAMNAME).toString(); 
        PutRecordResult putRecordResult = this.amazonKinesisClient.putRecord(pageViewStreamName, 
          wrap(gson.toJson(newMap).getBytes()), 
          partitionKey); 

        LOG.debug(format("Put Result in shardId %s with data %s: ", putRecordResult.getShardId(), newMap.toString())); 
       }); 

하지만 내 테스트가 작동하지 않습니다. 내 테스트는 여기에

FixtureGenerator fixtureGenerator = FixtureGenerator.create(). buildPageViewEvent(); 튜플 튜플 = MockTupleHelpers.mockTuple (fixtureGenerator.toJson());

when(this.random.nextInt(10000)).thenReturn(1000); 

    PutRecordResult putRecordResult = new PutRecordResult(); 
    putRecordResult.setShardId("shardId"); 
    when(this.amazonKinesisClient.putRecord(any(String.class), any(ByteBuffer.class), any(String.class))).thenReturn(putRecordResult); 

    bolt.execute(tuple, null); 

    verify(this.amazonKinesisClient).putRecord(this.captorStreamName.capture(), this.captorData.capture(), this.captorPartitionKey.capture()); 

    assertThat(this.captorStreamName.getValue(), is(equalTo("pageview-ci"))); 
    assertThat(this.captorPartitionKey.getValue(), is(equalTo("partitionKey-1000"))); 

bolt.execute은 화재 및 잊어 버리는 코드입니다.

내가 오류가 amazonKinesisClient가 호출되지 않습니다 때문입니다이

Wanted but not invoked: 
amazonKinesisClient.putRecord(
    <Capturing argument>, 
    <Capturing argument>, 
    <Capturing argument> 
); 
-> at io.data.bolt.EmitPageViewBoltTest.shouldEmitDataToKinesis(EmitPageViewBoltTest.java:83) 
Actually, there were zero interactions with this mock. 

Wanted but not invoked: 

입니다. Thread.sleep (1000) 시도했지만 작동하지 않습니다. 이 테스트 할

답변

0
  1. 한 가지 가능한 방법은 테스트 대상 클래스에 주입 할 수있는 ExecutorService 공장을 사용하는 것입니다. 테스트 설정의 경우 현재 스레드를 사용하는 ExecutorService을 사용할 수 있습니다. 이렇게하면 다중 스레드가 아닌 것처럼 기능을 테스트 할 수 있습니다.

  2. 다른 가능한 접근법은 별도의 클래스에있는 스레드에서 동작을 추출하고 해당 클래스를 별도로 테스트하는 것입니다.

  3. 경우에 따라 이상적이지는 않지만 실현 가능하거나 바람직하지 않은 경우는 주위 방법에서 Future을 반환하는 것입니다. 테스트에서 Future에서 get()을 호출하고 반환 값을 어설 션하고 예외가 발생하지 않았는지 확인할 수 있습니다.

현재 코드는 테스트를 실행 한 직후에 확인합니다. 이것은 경쟁 조건을 만듭니다. 수면은 도움이 될 수 있지만 안정적인 테스트를받지는 못합니다. amazonKinesisClient.putRecord()countDown()이라는 이진 코드 CountDownLatch을 보내고 확인하기 전에 테스트 방법에서 래치가 시간 초과 될 때까지 기다릴 수 있습니다.

당신은 이미 잠을 자고 있었고 그 방법은 불리지 않았다고 말합니다. 메서드가 호출되기 전에 Exception이 발생했을 수 있습니다. 더 많은 소스 코드가 없으면 그 예외가 무엇인지 알려주지 않습니다.