我已经设法解决了一个星期,但是一点都没有运气。问题出在单元测试上。
这是我要测试的课程:
import brave.Span;
import brave.Tracer;
@Service
public class InternetBackEndRestClient {
@Autowired
private Tracer tracer;
public PasswordJwtResponse generatePassworJwt(PasswordJwtRequest passwordJwtRequest, String traceId) throws LogonProxyException {
log.info("{\"Starting method\": \"generatePassworJwt\", \"input\": {} }", passwordJwtRequest);
Span newSpan = tracer.nextSpan().name("spanPasswordJwtResponse");
...
}
}
如何进行单元测试? Brave.Tracer是最后一堂课,所以我不能嘲笑它。无论如何要设置上下文?或模拟示踪剂?
@RunWith(MockitoJUnitRunner.class)
public class InternetBackEndRestClientTest {
@InjectMocks
private InternetBackEndRestClient internetBackEndRestClient;
@Mock
private Tracer tracer;
@Test
public void generatePassworJwt_test() {
internetBackEndRestClient.generatePassworJwt(...);
....
}
}
有人可以帮我吗?
答案 0 :(得分:1)
以下是对我有用的解决方案:
@RunWith(MockitoJUnitRunner.class)
public class InternetBackEndRestClientTest {
private static final String TRACEID = "12345678901234567890123456789012";
@InjectMocks
private InternetBackEndRestClient internetBackEndRestClient;
@Mock
private Tracer tracer;
@Mock
private Span span;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(tracer.nextSpan()).thenReturn(span);
when(tracer.nextSpan().name("spanPasswordJwtResponse"))
.thenReturn(span);
when(span.start()).thenReturn(span);
Tracing tracing = Tracing.newBuilder().build();
doReturn(tracing.tracer().withSpanInScope(span))
.when(tracer).withSpanInScope(span);
doNothing().when(span).finish();
...
}
...
}
答案 1 :(得分:0)
您的示例还不完整,因此很难识别出所有不正确的内容,但一件事是@MockBean
仅在使用Spring Boot测试的基础结构时才有效。这意味着您需要使用SpringRunner
来运行测试,并且还必须启用@MockBean
支持。最常见的方法是使用@SpringBootTest
:
@SpringBootTest
@RunWith(SpringRunner.class)
public class InternetBackEndRestClientTest {
// …
}
您可以在Spring Boot reference documentation中阅读有关@MockBean
的更多信息。
答案 2 :(得分:0)
您可以在测试中使用 TraceContext.newBuilder()
手动设置跨度和跟踪 ID,并将跟踪器传递到正在测试的类中。
Tracer tracer = Tracing.newBuilder().build().tracer();
TraceContext ctx = TraceContext.newBuilder().traceId(10L).spanId(10L).build();
Span span = tracer.toSpan(ctx);
tracer.withSpanInScope(span);
这可能比模拟 Tracer
类要轻一些