MOCKITO:没有这样的实例方法



我正在为下面的方法编写测试柜。

方法:

@Override
public void removeAllConnections(String uuid, String userName, String oimId) {
    customLogger.debug(Thread.currentThread().getStackTrace()[1].getMethodName(), userName, null, null, accessProviderBuilder.getUserName(), accessProviderBuilder.getUuid());
    UserAccessBean userAccessBean = new UserAccessBean(userName);
    userAccessBean.setOimid(oimId);
    userAccessBean.setToken("");
    log.info("removeAllConnections:oimid:"+userAccessBean.getOimId());
    UserProfileDetailBean userProfileDetail = accessClient.getAccess(userAccessBean,applicationForCsr);
    Set<AccountAccess> accountAccesses = userProfileDetail.getAccountAccessList();
    try {
        removeAllConnectionsExceptPrimary(oimId, userName, accountAccesses);
        removePrimaryConnection(oimId, userName, accountAccesses);
    } catch (ConnectionStateException e) {
        throw new ConnectionStateException(ConnectionNameNotRemoved, CONNECTION_REMOVAL_FAILED_MSG);
    } catch (InternalServerErrorException e) {
        throw new InternalServerErrorException(INTERNAL_SERVER_ERROR, INTERNAL_SERVER_ERROR_MSG);
    }
}

摘要下方是给定方法的测试用例。

testCase:

@Test
public void testRemoveAllConnections() {
    UserAccessBean userAccessBean = new UserAccessBean(userName);
    when(accessClient.getAccess(userAccessBean,"CSR")).thenReturn(userProfileDetail);
    when(userProfileDetail.getAccountAccessList()).thenReturn(accountAccesses);
    String applicaionForCSR = "CSR";
    ReflectionTestUtils.setField(service, "applicationForCsr", applicaionForCSR);
    service.removeAllConnections(uuid, userName, oimId);
}

在调试代码时,我的执行情况在下面的行中失败,因为 userProfiledEtail的值为null。

Set<AccountAccess> accountAccesses = userProfileDetail.getAccountAccessList();

accessClient.getAccess(userAccessBean,applicationforcsr)上进行检查元素时,它的抛出以下是错误。可以肯定的是,这是一个愚蠢的错误,但无法追踪。

错误:

没有这样的实例方法:'userprofiledetailbean v1.AccessService $$ EnhancerbyMockitOwitHcglib $$ a852895d.getAccess (useraccessbean)'

应用程序:Spring Boot 1.5.0图书馆:Mockito 2.7.x

我可以建议三个可能的解决方案(或更像2.5):

a)覆盖UserAccessBeanequals方法,因此当两个names相等时,两个UserAccessBeans是相等的。当然,这可能会干扰您的生产代码,我不会仅更改测试的等价方法。

b)由于用户名实际上在您的测试中没有起作用(测试本身定义了用户名是什么),因此您可以简单地忽略...

when(accessClient.getAccess(Mockito.any(UserAccessBean.class),Mockito.eq("CSR"))).thenReturn(userProfileDetail);

以这种方式,将返回使用第一个参数的任何值的UserProfileDetail。当然,您在这里丢失了细节,因此,例如,如果用户名有某种错误,测试是正确的,但是很可能无论如何都无法进行测试。

Mockito.any(...)是一个所谓的 matcher ,它告诉overito无论对所讨论的参数提供什么值,都会"使用"此规则。您放在那里的任何东西都可以使用Mockito。Mockito.eq("CSR")告诉它,此参数必须等于" CSR"。因此,整个规则是...

如果有人调用 accessClient.getAccess,无论第一个参数ist是什么,但是第二个参数必须等于" csr",则返回 userProfileDetail

因此,第一个参数可以是任何东西。因此,例如,将接受以下电话:

accessClient.getAccess(new UserAccessBean("correct name"), "CSR");
accessClient.getAccess(new UserAccessBean("totally wrong name"), "CSR");

...因为第一个参数是什么都没关系,因此任何值都将被接受。因此,您"丢失"的东西可以检查UserAccessBean是否是正确的(因为任何人已接受)。但是就您而言,由于您仅在测试中定义了这些UserAccessBeans,所以这应该不是问题。

但是,如果是,我可以提供两个解决方法...

c)使用客户匹配器(检查UserAccessBean的名称)或使用上述Mockito.any(...),然后使用参数captor检查名称是否正确...

ArgumentCaptor<UserAccessBean> captor = ArgumentCaptor.forClass(UserAccessBean.class);
Mockito.verify(accessClient).getAccess(captor.capture(),Mockito.eq("CSR"));
assertEquals(captor.getValue().getName(), "myName");

相关内容

  • 没有找到相关文章

最新更新