我试图为给定的类创建测试用例,并希望返回traceId值,但得到跟踪。currentSpan()为null。
这是我的班级
public class ConsumerService{
private final Tracer tracer;
@Autowired
private RequestService requestService;
public void consumerProductionRequest(DisclaimerRequest disclaimerRequest){
String traceId=tracer.currentSpan.context().traceId();
log.info(traceId);
if(disclaimerRequest.getReqId()==null){
disclaimerRequest.setReqId(UUID.randomUUID().toString());
}
}
}
//Test Class
@ExtendWith(MockitoExtension.class)
class ConsumerServiceTest{
@InjectMocks
ConsumerService consumerService;
@Autowired
Tracer tracer;
@Test
void Test(){
Tracer tracer=Mockito.mock(Tracer.class);
String traceId;
Mockito.when(tracer.currentSpan().context.traceId()).thenReturn(traceId);
DisclaimerRequest disclaimerRequest=new DisclaimerRequest();
consumerService.consumerProductionRequest(disclaimerRequest);
}
}
为什么我有追踪器。currentSpan()null。我使用的是JUnit 5和New。请有人帮我解决这个问题。
3条答案
按热度按时间3vpjnl9f1#
在这里,在您的test类中:
把它变成
(and将相应的导入添加到Mockito)。您希望Mockito创建一个模拟对象,然后将其插入到您的测试对象中。还要注意,测试方法本身重新定义了
tracer
,因此隐藏了您在类级别上所做的任何其他操作。因此,测试方法中的tracer
规范不会对已经注入到测试对象中的模拟Tracer示例产生任何影响。o2gm4chl2#
tracer将被模拟,您可以在debug中看到它,或者只是简单地打印它。另外,每个方法都返回null,因为你没有指定哪个方法将返回值,因为spring context在单元测试中不起作用。在集成测试中,您可以自动连接它。
您必须模拟能够解决问题的getCurrentSpan和getContext方法。你也不能自动连接它,只能使用@Mock注解。Spring上下文在单元测试中不存在,所以它不会自动连接。Spring相关代码将无法工作。集成测试为您运行spring上下文,您可以自动连接它。
liwlm1x93#
这对我很有效
不需要使用@Mock