所以我有一个服务类。
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();
无效。
我是一个无能为力的初学者,在创建测试。非常感谢和奖励任何帮助,谢谢。 我已准备好回答任何意见/问题,以提供有关该问题的更多细节。
答案 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();