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();
所以我有一项服务 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();