Mockito:如何测试是否在 Mock 的方法中调用了另一个 class' 方法?

Mockito: How to test if another class' method is called within a method of a Mock?

所以我有一项服务 class。

public class OrganisationService {
    public List<Organisation> findAllForeignOrganisations() {
        // a few rows of JPQL-code that searches the database
        return myCriteria.getResultList();
    }
    //...Other methods that return Lists with other types of organisations...
}

然后我有一个 class 我想测试。我想测试的是,当class的方法getAllowedOrganisations被赋予特定参数时(在这种情况下为OrganisationType.FOREIGN),使用上述方法findAllForeignOrganisation()来搜索列表组织。

public class OrganisationSelectionOptions {

@Inject OrganisationService os;

public List<Organisation> getAllowedOrganisations(Assignment a) {
    OrganisationType type = a.getOrganisationType();
    return giveOrganisationListWithType(type);
}

private List<Organisation> giveOrganisationListWithType(OrganisationType type) {
    List<Organisation> organisations;
    if (type == OrganisationType.FOREIGN) {
        organisations = os.findAllForeignOrganisations();
    }
    // ...some other organisations types on if-clauses...
    return organisations;
    }
}

}

我做了一个 JUnit 测试来测试这个。我必须创建上述 classes 的模拟,因为它们访问数据库,目前我无法在测试中访问数据库,并且希望避免对测试实施数据库结构。

@RunWith(Arquillian.class)
@PrepareForTest(Organisation.class)
public class OrganisationSelectionTest  {
    @Test
    public void testWithForeignType() throws RreflectionUtilException {
        // ...code to create a dummy Assignment with FOREIGN type   organisation...

    mockedOrganisationService = mock(OrganisationService.class);
    mockedOrganisationSelectionOptions = mock(OrganisationSelectionOptions.class);


    }
}

现在我尝试了 Mockito 的 verify 以某种方式进行测试,如果 mockedOrganisationSelectionOptions.giveOrganisationListWithType(dummyAssignmentWithForeignTypeOrganisation) 调用 os.findAllForeignOrganisations(); 无济于事。

我是创建测试的无知初学者。任何帮助将不胜感激和奖励,谢谢。 我准备好回答任何 comments/questions 以提供有关该问题的更多详细信息。

这可以通过多种方式完成,但我将介绍其中一种。首先,因为您使用 @Inject 来获取您的 OrganisationService 实例,所以我不会乱搞模拟 new OrganisationService() 构造函数调用。相反,我们可以为 OrganisationService 设置一个 getter 方法,然后模拟它。

在 OrganisationSelectionOptions 中添加 getter。

OrganisationService getOrganisationService(){
    return os;
}

编辑您的 giveOrganisationListWithType 方法以使用我们新的 getter。

organisations = getOS().findAllForeignOrganisations();

在你的单元测试中模拟一个 OrganisationService 的实例。有两种方法可以做到这一点。

方法一:在ToimeksiannonYhtiovalintaTest中添加如下内容

@Mock 
private OrganisationService mockOS;

方法二:在测试方法中实例化你的mockOS

OrganisationService mockOS = mock(OrganisationService.class);

要使方法一起作用,您需要包括..

@RunWith(MockitoJUnitRunner.class)

在 ToimeksiannonYhtiovalinta 测试中。这是class级别的注释。

接下来我们需要侦测被测对象。

OrganisationSelectionOptions toTest = spy( new OrganisationSelectionOptions ());

然后模拟我们的新 getter 方法。

when(toTest.getOrganisationService()).thenReturn(mockOS);

给你。

编辑:添加...

Edit your giveOrganisationListWithType method to use our new getter.

organisations = getOS().findAllForeignOrganisations();