Spring Boot 2.0.5.RELEASE-侦探和Mockito

时间:2018-10-06 09:41:01

标签: spring-boot mockito spring-boot-test spring-cloud-sleuth

我已经设法解决了一个星期,但是一点都没有运气。问题出在单元测试上。

这是我要测试的课程:

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

有人可以帮我吗?

3 个答案:

答案 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 类要轻一些