Mockito:如何测试是否在模拟方法中调用了另一个类的方法?

时间:2015-05-15 13:55:13

标签: junit mocking mockito jboss-arquillian verify

所以我有一个服务类。

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...
}

然后我有一个我想测试的课程。我要测试的是,当下面的类的方法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测试来测试它。我必须创建上述类的模拟,因为它们访问数据库,目前我无法在测试中访问数据库,并且希望避免为测试实现数据库结构。

@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();无效。

我是一个无能为力的初学者,在创建测试。非常感谢和奖励任何帮助,谢谢。 我已准备好回答任何意见/问题,以提供有关该问题的更多细节。

1 个答案:

答案 0 :(得分:2)

这可以通过多种方式完成,但我会重复一遍。首先,因为你使用@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)

在ToimeksiannonYhtiovalintaTest。这是一个类级注释。

接下来,我们需要监视正在测试的对象。

OrganisationSelectionOptions toTest = spy( new OrganisationSelectionOptions ());

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

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

你去。

编辑:补充......

  

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

organisations = getOS().findAllForeignOrganisations();