2017-10-08 9 views
0

以下の方法でテストを行っています。 `junitテストでリアクタスイッチオフが予期どおりに動作しない

class ScrapedRecipeCache @Autowired constructor(private val cache: RecipeScrapingCacheService, 
               private val recipeService: RecipeService) : ScrapedRecipeProvider { 
    override fun provide(request: ScrapingRequest): Flux<ScrapedRecipe> = 
      cache.retrieve(request.link) 
        .doOnNext { println(it) } 
        .flatMap { (link, _, recipeHash, error) -> 
         recipeService.findByHash(recipeHash) 
           .map { ScrapedRecipe(it, link, error)} 
           .switchIfEmpty(cache.remove(request.link).then(Mono.empty())) 
        } 
        .flux() 


} 

` 次のようにテストが見えます:

private val recipeFetched = Recipe("Tortellini", RecipeDifficulty.EASY, 15.0) 

val cacheContents = RecipeScrapingResource("www.google.com", ScrapingOrigin.JAMIE_OLIVER, recipeFetched.hash, 
        mutableListOf(
          pl.goolash.core.Exception("aa", ErrorType.WARNING, LocalDateTime.MIN) 
        )) 
val request = ScrapingRequest("www.google.com", ScrapingOrigin.JAMIE_OLIVER, 4) 

@BeforeEach 
fun setUp() { 
given(cache.retrieve("www.google.com")).willReturn(Mono.just(cacheContents)) 
given(recipeService.findByHash(recipeFetched.hash)).willReturn(Mono.just(recipeFetched)) 
} 

@Test 
@DisplayName("Then return data fetched from service and don't delete cache") 
fun test() { 
     cacheFacade.provide(request) 
          .test() 
          .expectNext(ScrapedRecipe(recipeFetched, "www.google.com", cacheContents.error!!)) 
          .expectComplete() 
          .verify() 
     BDDMockito.verify(cache, BDDMockito.never()).remove(request.link) 
       } 

cache.remove(request.link)が呼び出されるので、テストが失敗しました。 switchIfEmptyは、recipeService.findByHashがMono.empty()を返すときにのみ発生する必要があります。しかし、デバッガはMono.just(fetchedRecipe)の値を返すことを示しています。

興味深いのは、私はその後

.switchIfEmpty(Mono.just(1).doOnNext{println("weeee")}.then(Mono.empty())) 

.switchIfEmpty(cache.remove(request.link).then(Mono.empty())) 

を交換するときWEEEはそれが期待通りに動作しますので、印刷されていないということです、それはswitchIfEmptyが解雇されていないです。

さらに、テストされた問題は統合テストで正しく実行され、キャッシュはクリアされません。

原子炉バージョン:3.1.0-RC1 その他の注目すべき内容:春のブート2.0.0-M4、Mockitoコア:2.10、JUnitの5、プロジェクトがkotlinで書かれている

質問は、誰が見るんこれに何か問題がありますか?なぜなら、私は2日以上過ごしてしまったので、これがなぜそんなにうまく動作しないのか分からないからです。

答えて

1

最後に、この作業の仕方を見つけました。それを改善するために

override fun provide(request: ScrapingRequest): Flux<ScrapedRecipe> = 
     cache.retrieve(request.link) 
       .flatMap { (link, _, recipeHash, error) -> 
        recipeService.findByHash(recipeHash) 
          .map { ScrapedRecipe(it, link, error) } 
          .switchIfEmpty(Mono.just(1) 
            .flatMap { cache.remove(request.link) } 
            .then(Mono.empty())) 
       } 
       .flux() 

あなたは、これがneatest実装ではありません、それは私に隠れて非常に興味深いメカニズムを明らかにした場合でも、非同期の作業を実行するためにflatMapを使用して仕事をしていませんどのように見ることができますここに。

関連する問題