使用Mockito在JUnit中获取BadRequestException

使用Mockito在JUnit中获取BadRequestException,junit,java-8,mockito,spring-webflux,Junit,Java 8,Mockito,Spring Webflux,我正在使用Mockito为服务类编写Junit。应用程序是使用Java8、Spring5构建的。而我的其他测试方法运行良好,除了这一个,我被卡住了,无法进一步进行 @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = CommerceConnectorApplication.class) @ActiveProfiles("

我正在使用Mockito为服务类编写Junit。应用程序是使用Java8、Spring5构建的。而我的其他测试方法运行良好,除了这一个,我被卡住了,无法进一步进行

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = CommerceConnectorApplication.class)
@ActiveProfiles("test")
@AutoConfigureWebTestClient
public class CommerceRepositoryDetailsTest {

  @Autowired
  private RepositoryDetails repositoryDetails;

  @MockBean
  private AsyncRunner asyncRunner;

  @MockBean
  private CommerceTenantUserRepository tenantUserRepository;

  @Test
  public void whenUpdateCartId_ThenReturnUpdatedTenantUserDetails(){
    String tenantId = "2737363";
    String userId = "763sssj";
    String cartId = "827";

    TenantUserKey tenantUserKey = new TenantUserKey();
    tenantUserKey.setTenantId(tenantId);
    tenantUserKey.setUserId(userId);

    CommerceTenantUser commerceTenantUser = new CommerceTenantUser(tenantUserKey, "xyz@abc.com", cartId, LocalDate.now());
    Optional <CommerceTenantUser> commerceTenantUser1 = Optional.of(commerceTenantUser);


    Mockito.when(tenantUserRepository.findById(tenantUserKey)).thenReturn(commerceTenantUser1);

    Mono<CommerceTenantUser> actualMono = repositoryDetails.updateCartId(tenantId, userId, cartId);
    CommerceTenantUser commerceTenantUser2 = actualMono.block();

    assertThat(commerceTenantUser2, is(commerceTenantUser));

  }
}
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=SpringBootTest.webEnvironment.RANDOM_端口,class=CommerceConnectorApplication.class)
@ActiveProfiles(“测试”)
@自动配置WebTestClient
公共类商业存储详细信息测试{
@自动连线
私人回购详情回购详情;
@蚕豆
专用异步运行程序异步运行程序;
@蚕豆
私人商业承租人住宅承租人住宅承租人;
@试验
当更新的CartId\u然后返回更新的TenantuserDetails()时公共无效{
字符串tenantId=“2737363”;
字符串userId=“763sssj”;
字符串cartId=“827”;
TenantUserKey TenantUserKey=新的TenantUserKey();
tenantUserKey.setTenantId(tenantId);
setUserId(userId);
CommerceTenantUser CommerceTenantUser=新的CommerceTenantUser(租户密钥)xyz@abc.com,cartId,LocalDate.now());
可选的commerceTenantUser1=可选的.of(commerceTenantUser1);
Mockito.when(tenantUserRepository.findById(tenantUserKey)),然后返回(commerceTenantUser1);
Mono actualMono=repositoryDetails.updateCartId(tenantId、userId、cartId);
CommerceTenantUser commerceTenantUser2=actualMono.block();
(商业地产商2,即(商业地产商));
}
}
错误:-

2018-08-14 16:19:38.843  INFO 106888 --- [           main] c.s.c.c.c.s.CommerceRepositoryDetails    : Entering updateCartId@CommerceSystemDetailService

com.sap.chatbot.commerceconnector.exception.BadRequestException: error in updating cart

    at com.sap.chatbot.commerceconnector.common.security.CommerceRepositoryDetails.updateCartId(CommerceRepositoryDetails.java:139)
    at com.sap.chatbot.commerceconnector.common.security.CommerceRepositoryDetails$$FastClassBySpringCGLIB$$fd3bfefe.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:53)
    at org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:337)
    at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:392)
    at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:317)
    at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
    at com.sap.chatbot.commerceconnector.common.security.CommerceRepositoryDetails$$EnhancerBySpringCGLIB$$3b388d4d.updateCartId(<generated>)
    at com.sap.chatbot.commerceconnector.CommerceRepositoryDetailsTest.whenUpdateCartId_ThenReturnUpdatedTenantUserDetails(CommerceRepositoryDetailsTest.java:124)
2018-08-14 16:19:38.843信息106888---[main]c.s.c.c.s.commerce位置详细信息:输入updateCartId@CommerceSystemDetailService
com.sap.chatbot.commerceconnector.exception.BadRequestException:更新购物车时出错
在com.sap.chatbot.commerceconnector.common.security.CommercePositionDetails.updateCartId(CommercePositionDetails.java:139)上
在com.sap.chatbot.commerceconnector.common.security.CommerceCepositoryDetails$$FastClassBySpringCGLIB$$FD3Befe.invoke()上
位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
位于org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:163)上
位于org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:53)
位于org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:337)
位于org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:392)
位于org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:317)
位于org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:185)
位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
在com.sap.chatbot.commerceconnector.common.security.CommerceCepositoryDetails$$EnhancerBySpringCGLIB$$3b388d4d.updateCartId()上
在com.sap.chatbot.commerceconnector.commercepositorydetailstest.whenUpdateCartId\u然后返回更新的Tenantuserdetails(commercepositorydetailstest.java:124)
测试的主要方法:-

    @Override
    @CachePut(value = CommerceConnectorConstants.CommerceCache.COMMERCE_CACHE_TENANT_USER_DATA_MAP)
    public Mono<CommerceTenantUser> updateCartId(String tenantId, String userId, String cartId) {
        logger.info("Entering updateCartId@CommerceSystemDetailService");

        final TenantUserKey commerce = getTenantUserObj(tenantId, userId);
        Optional<CommerceTenantUser> tenantUser = commerceTenantUserRepository.findById(commerce);

        return tenantUser.map(tenantUserObj -> updateCartIdAndRefreshMap(tenantUserObj, cartId))
                .orElse(Mono.error(new BadRequestException("error in updating cart")));

    }

    private Mono<CommerceTenantUser> updateCartIdAndRefreshMap(CommerceTenantUser tenantUserObj, String cartId) {
        tenantUserObj.setCartId(cartId);
        final Mono<CommerceTenantUser> commerceTenantUser = asyncRunner
                .one(() -> commerceTenantUserRepository.saveAndFlush(tenantUserObj))
                .doOnNext(value -> commerceCacheService.refreshMap())
                .doOnError(error -> Mono.error(new BadRequestException("Error ocurred in updating cart id ")))
                .map(commerceTenantUserObj -> commerceTenantUserObj);
        return commerceTenantUser;

    }
@覆盖
@CachePut(值=CommerceConnectorConstants.CommerceCache.COMMERCE\u缓存\u租户\u用户\u数据\u映射)
public Mono updateCartId(字符串tenantId、字符串userId、字符串cartId){
logger.info(“输入updateCartId@CommerceSystemDetailService");
final-TenantUserKey-commerce=getTenantUserObj(tenantId,userId);
可选tenantUser=commerceTenantUserRepository.findById(commerce);
返回tenantUser.map(tenantUserObj->updatecartiandrefreshmap(tenantUserObj,cartId))
.orElse(Mono.error(新的BadRequestException(“更新购物车时出错”));
}
私有Mono UpdateCartAndRefreshMap{
tenantUserObj.setCartId(cartId);
最终单声道commerceTenantUser=asyncRunner
.1(()->commerceTenantUserRepository.saveAndFlush(tenantUserObj))
.doOnNext(值->commerceCacheService.refreshMap())
.doon错误(错误->单点错误(新的BadRequestException(“更新购物车id时出错”))
.地图(commerceTenantUserObj->commerceTenantUserObj);
返回商业用户;
}
方法updateCartId()调用另一个私有方法updateCartAndRefreshMap()。我的JUnit在updateCartId()中的返回语句中失败


请建议如何修复我的JUnit以测试此特定的updateCartId()方法。

您正在模拟asynchRunner,但没有针对它的when调用。您好@MichaelPeacock,很抱歉,我不理解您的语句“但没有针对它的when调用…”。是的,我正在模拟asynchRunner,因为私有方法updateCartidRefreshMap()需要它。请你详细说明一下你的陈述,好让我理解你的意思吗?谢谢asynchRunner对象是一个模拟对象。您在updateCartidRefreshMap()中多次调用此模拟,但测试中没有Mockito.when(asynchRunner.xxx()…)调用。