Mockito:如何正确模拟 Spring 服务列表
Mockito: How to properly mock a List of Spring Services
我正在尝试使用 Mockito 测试以下 Spring 服务 class:
@Service
public class ObjectExportService {
@Autowired
protected List<SecuredService<? extends SecuredObject>> securedServices;
public void doStuff() {
for(int i = 0; i < this.securedServices.size(); i++){
SecuredService<? extends SecuredObject> securedSrv = this.securedServices.get(i);
//this access works
}
for (SecuredService<? extends SecuredObject> securedSrv : this.securedServices) { //this access does not work
}
}
}
这是我对该服务的测试class:
@RunWith(MockitoJUnitRunner.class)
public class ObjectExportServiceTest {
@InjectMocks
private ObjectExportService objectExportService;
@Mock
protected List<SecuredService<? extends SecuredObject>> securedServices;
@Test
public void testDoStuff(){
objectExportService.doStuff();
Assert.assertTrue(true);
}
}
当我 运行 测试时,我得到一个 NullpointerException,但只在 for-each 循环中。
首先我假设是一个与 this 线程中描述的类似的问题:
我已经模拟了列表,因此需要模拟 iterator()
调用。
该线程中提供的解决方案对我不起作用,因为我实际上是在自动装配一个列表。
所以我在另一个线程中偶然发现了 解决方案。只需将 @Mock
更改为 @Spy
即可解决我的问题:
@RunWith(MockitoJUnitRunner.class)
public class ObjectExportServiceTest {
@InjectMocks
private ObjectExportService objectExportService;
@Spy // <-- change here
protected List<SecuredService<? extends SecuredObject>> securedServices;
@Test
public void testDoStuff(){
objectExportService.doStuff();
Assert.assertTrue(true);
}
}
我正在尝试使用 Mockito 测试以下 Spring 服务 class:
@Service
public class ObjectExportService {
@Autowired
protected List<SecuredService<? extends SecuredObject>> securedServices;
public void doStuff() {
for(int i = 0; i < this.securedServices.size(); i++){
SecuredService<? extends SecuredObject> securedSrv = this.securedServices.get(i);
//this access works
}
for (SecuredService<? extends SecuredObject> securedSrv : this.securedServices) { //this access does not work
}
}
}
这是我对该服务的测试class:
@RunWith(MockitoJUnitRunner.class)
public class ObjectExportServiceTest {
@InjectMocks
private ObjectExportService objectExportService;
@Mock
protected List<SecuredService<? extends SecuredObject>> securedServices;
@Test
public void testDoStuff(){
objectExportService.doStuff();
Assert.assertTrue(true);
}
}
当我 运行 测试时,我得到一个 NullpointerException,但只在 for-each 循环中。
首先我假设是一个与 this 线程中描述的类似的问题:
我已经模拟了列表,因此需要模拟 iterator()
调用。
该线程中提供的解决方案对我不起作用,因为我实际上是在自动装配一个列表。
所以我在另一个线程中偶然发现了 @Mock
更改为 @Spy
即可解决我的问题:
@RunWith(MockitoJUnitRunner.class)
public class ObjectExportServiceTest {
@InjectMocks
private ObjectExportService objectExportService;
@Spy // <-- change here
protected List<SecuredService<? extends SecuredObject>> securedServices;
@Test
public void testDoStuff(){
objectExportService.doStuff();
Assert.assertTrue(true);
}
}