首页 > 解决方案 > 在 @BeforeStep 之前初始化测试中的 Mocks

问题描述

我有一个带有 @BeforeStep 函数的自定义阅读器,以便初始化一些数据。这些数据来自外部数据库。

@Component
public class CustomReader implements ItemReader<SomeDTO> {

    private RestApiService restApiService;

    private SomeDTO someDTO;

    @BeforeStep
    private void initialize() {
        someDTO = restApiService.getData();
    }

    @Override
    public SomeDTO read() {
        ...    
        return someDTO
    }

}

在我的单元测试中,我需要模拟对外部数据库的调用。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = NedBatchApplication.class)
public class CustomReaderTest {

    @Autowired
    CustomReader customReader;

    @Mock
    RestApiService restApiService;

    @Before
    private void setup() {
        MockitoAnnotations.initMocks(this);
        ReflectionTestUtils.setField(customReader, "restApiService", restApiService);
        Mockito.when(restApiService.getData().thenReturn(expectedData);
    }
}

我面临的问题是@BeforeStep 在单元测试的@Before 之前执行,当我启动我的测试时。所以restApiService.getData() 返回null 而不是expectedData。

有没有办法实现我想要的,或者我需要用不同的方法来做到这一点?

标签: javamockitospring-batchspring-boot-test

解决方案


经过与同事的反思后,他给了我一个解决方案:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = NedBatchApplication.class)
public class CustomReaderTest {

  CustomReader customReader;

  @Mock
  RestApiService restApiService;

  @Before
  private void setup() {
      MockitoAnnotations.initMocks(this);
      Mockito.when(restApiService.getData().thenReturn(expectedData);

      this.customReader = new CustomReader(restApiService);
  }

 @Test
 public void test() {
   customReader.initialize();
   (...)
 }
}

推荐阅读