繁体   English   中英

在@BeforeStep之前初始化测试中的Mocks

[英]Initialize Mocks in test before @BeforeStep

我有一个带有@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。

有没有一种方法可以实现我想要的东西,或者我需要使用其他方法来做到这一点?

您是否可以确定BeforeStepBefore注释Before运行(通过使用日志记录或类似方法?)。

您的Mockito调用可能不完全正确。 尝试改用Mockito.doReturn(expectedData).when(restApiService).getData()

作为一种替代方法,如果在您的自定义阅读器中自动连接了RestApiService ,则可以在测试中的自定义阅读器声明上使用@InjectMocks批注,这将导致将restApiService版本注入到类中在测试中。

通常,在使用基于Spring的测试时,请尝试使诸如restApiService (您要模拟的依赖)之类的依赖关系成为Spring Bean,然后您可以指示Spring创建模拟并在创建应用程序上下文的过程中将其注入到应用程序上下文中。 @MockBean批注:

import org.springframework.boot.test.mock.mockito.MockBean;  
@RunWith(SpringRunner.class)
@SpringBootTest(classes = NedBatchApplication.class)
public class CustomReaderTest {

    @MockBean
    private RestApiService restApiService; 
}

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

@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();
   (...)
 }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM