【问题标题】:Mockito: How to properly mock a List of Spring ServicesMockito:如何正确模拟 Spring 服务列表
【发布时间】:2021-03-26 03:32:45
【问题描述】:

我尝试使用 Mockito 测试以下 Spring Service 类:

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

这是我对该服务的测试类:

@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() 调用。

该线程中提供的解决方案对我不起作用,因为我实际上是在自动装配一个列表。

【问题讨论】:

    标签: spring mockito


    【解决方案1】:

    所以我在另一个线程中偶然发现了this 解决方案。只需将 @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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      相关资源
      最近更新 更多