gpt4 book ai didi

java - SpringBoot Junit bean Autowiring

转载 作者:搜寻专家 更新时间:2023-10-31 19:52:54 24 4
gpt4 key购买 nike

我尝试为我的服务编写 junit 测试。我在我的项目中使用 spring-boot 1.5.1。一切正常,但是当我尝试 Autowiring bean(在 AppConfig.class 中创建)时,它给了我 NullPointerException。我几乎尝试了所有方法。

这是我的配置类:

@Configuration 
public class AppConfig {

@Bean
public DozerBeanMapper mapper(){
DozerBeanMapper mapper = new DozerBeanMapper();
mapper.setCustomFieldMapper(new CustomMapper());
return mapper;
}
}

和我的测试类:

@SpringBootTest
public class LottoClientServiceImplTest {
@Mock
SoapServiceBindingStub soapServiceBindingStub;
@Mock
LottoClient lottoClient;
@InjectMocks
LottoClientServiceImpl lottoClientService;
@Autowired
DozerBeanMapper mapper;

@Before
public void setUp() throws Exception {
initMocks(this);
when(lottoClient.soapService()).thenReturn(soapServiceBindingStub);
}

@Test
public void getLastResults() throws Exception {

RespLastWyniki expected = Fake.generateFakeLastWynikiResponse();
when(lottoClient.soapService().getLastWyniki(anyString())).thenReturn(expected);

LastResults actual = lottoClientService.getLastResults();

谁能告诉我哪里出了问题?

错误日志:

java.lang.NullPointerException
at pl.lotto.service.LottoClientServiceImpl.getLastResults(LottoClientServiceImpl.java:26)
at pl.lotto.service.LottoClientServiceImplTest.getLastResults(LottoClientServiceImplTest.java:45)

这是我的服务:

@Service
public class LottoClientServiceImpl implements LottoClientServiceInterface {
@Autowired
LottoClient lottoClient;
@Autowired
DozerBeanMapper mapper;
@Override
public LastResults getLastResults() {
try {
RespLastWyniki wyniki = lottoClient.soapService().getLastWyniki(new Date().toString());
LastResults result = mapper.map(wyniki, LastResults.class);
return result;
} catch (RemoteException e) {
throw new GettingDataError();
}
}

最佳答案

当然,由于 @InjectMocks,您的依赖项将是 null,您正在创建一个新实例,在 Spring 的可见性之外,因此不会自动连接任何内容。

Spring Boot 具有广泛的测试支持,还可以用模拟替换 beans,请参阅 the testing section Spring Boot 引用指南。

要修复它,请使用框架而不是绕过它。

  1. @MockBean替换@Mock
  2. @Autowired替换@InjectMocks
  3. 删除您的设置方法

此外,显然您只需要模拟 SOAP stub (因此不确定您需要为 LottoClient 模拟什么)。

像这样的东西应该可以解决问题。

@SpringBootTest
public class LottoClientServiceImplTest {

@MockBean
SoapServiceBindingStub soapServiceBindingStub;

@Autowired
LottoClientServiceImpl lottoClientService;

@Test
public void getLastResults() throws Exception {

RespLastWyniki expected = Fake.generateFakeLastWynikiResponse();
when(soapServiceBindingStub.getLastWyniki(anyString())).thenReturn(expected);

LastResults actual = lottoClientService.getLastResults();

关于java - SpringBoot Junit bean Autowiring ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43099556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com