Mockito:没有这样的实例方法

时间:2017-11-25 13:09:42

标签: java intellij-idea junit mockito testcase

我正在为下面给出的方法编写测试用例。

方法:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

   let touch = touches.first
    if let lblView = touch?.view
    {
        if lblView.isKind(of: UILabel.self)
        {
            let yourLbl = lblView as! UILabel

            //Access your clicked lable
        }
    }


}

以下片段是给定方法的测试用例。

测试用例:

@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);
    }
}

在调试代码时,由于 userProfileDetail 的值为null,我的执行在给定行下面失败。

@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);

}

accessClient.getAccess(userAccessBean,applicationForCsr)上执行检查元素时,它会抛出以下错误。很确定这是一个愚蠢的错误,但无法追踪它。

错误:

  

没有这样的实例方法:'UserProfileDetailBean   v1.AccessService $$ EnhancerByMockitoWithCGLIB $$ a852895d.getAccess   (UserAccessBean)'

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

1 个答案:

答案 0 :(得分:2)

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

a)覆盖equals的{​​{1}}方法,以便当且仅当UserAccessBean相等时,两个UserAccessBeans相等。当然,这可能会干扰您的生产代码,我不会仅仅为了测试而改变equals方法。

b)由于用户名实际上并没有在您的测试中发挥重要作用(测试本身定义了用户名是什么),您可以简单地忽略详细信息......

names

这样,将为第一个参数的任何值返回userProfileDetail。当然,你在这里丢失了详细信息,例如,如果用户名在某种程度上是错误的,那么测试将是正确的,但无论如何,这在测试中是不可能的。

when(accessClient.getAccess(Mockito.any(UserAccessBean.class),Mockito.eq("CSR"))).thenReturn(userProfileDetail); 是一个所谓的匹配器,它告诉Mockito&#34;使用&#34;无论给出的参数值是什么值,这条规则。你放在那里的任何东西都适合Mockito。 Mockito.any(...)告诉它,此参数必须等于&#34; CSR&#34;。所以,整个规则是......

如果有人拨打Mockito.eq("CSR"),无论第一个参数是什么,但第二个参数必须等于&#34; CSR&#34;,然后返回accessClient.getAccess

所以,有了这个,第一个参数可以是任何东西。因此,例如,接受以下呼叫:

userProfileDetail

...因为第一个参数是什么并不重要,所以接受任何值。所以,你失去了什么&#34;能够检查accessClient.getAccess(new UserAccessBean("correct name"), "CSR"); accessClient.getAccess(new UserAccessBean("totally wrong name"), "CSR"); 是否正确(因为任何被接受)。但是在你的情况下,因为你只在测试中定义了那些UserAccessBean,这应该不是问题。

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

c)使用客户匹配器(检查UserAccessBean的名称)或使用上面的UserAccessBeans和ArgumentCaptor来检查名称到底是否正确...

Mockito.any(...)