Spring boot Spring boot 2.0.5.RELEASE-sleuth和mockito

Spring boot Spring boot 2.0.5.RELEASE-sleuth和mockito,spring-boot,mockito,spring-boot-test,spring-cloud-sleuth,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 pa

我已经试着解决这个问题一个星期了,但一点运气都没有。问题在于单元测试

这是我尝试测试的类:

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");
    ...
  }
}
如何进行单元测试?勇敢。Tracer是最后一门课,所以我不能嘲笑它。是否需要设置上下文?还是模拟追踪

@RunWith(MockitoJUnitRunner.class)
public class InternetBackEndRestClientTest {

   @InjectMocks
   private InternetBackEndRestClient internetBackEndRestClient; 

   @Mock
   private Tracer tracer; 

   @Test
   public void generatePassworJwt_test() { 
      internetBackEndRestClient.generatePassworJwt(...);
      ....
   }
}

谁能帮我一下吗

您的示例并不完整,因此很难找出所有不正确的地方,但有一点是@MockBean只有在您使用Spring Boot测试的基础设施时才起作用。这意味着您需要使用SpringRunner来运行测试,并且还必须启用@MockBean支持。最常用的方法是使用@SpringBootTest:


您可以在中阅读有关@MockBean的更多信息。

您的示例并不完整,因此很难确定所有不完全正确的地方,但有一点是@MockBean只有在使用Spring引导测试的基础设施时才起作用。这意味着您需要使用SpringRunner来运行测试,并且还必须启用@MockBean支持。最常用的方法是使用@SpringBootTest:


您可以在中阅读有关@MockBean的更多信息。

以下是对我有效的解决方案:

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

        ...
    }
    ...
}

以下是对我有效的解决方案:

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

        ...
    }
    ...
}

如果您使用的是Mockito的JUnit runner,那么如何创建应用程序上下文以便@Autowired注入发生?你能分享一下你在做什么吗?我用一个例子更新了这个问题。谢谢。如果您使用的是Mockito的JUnit runner,那么如何创建应用程序上下文以便@Autowired注入发生?你能分享一下你在做什么吗?我用一个例子更新了这个问题。谢谢。对不起,您在示例中遗漏了什么?您可以看到我尝试测试的类以及测试类。我不能使用@MockBean,这很好。但是我只想用mockito做一个单元测试,我需要mock Brave.Trace,这样指令Span newSpan=tracer.nextSpan.namespanPasswordJwtResponse;不会因为变量tracer为null而失败。您的示例没有显示如何获取正在测试的InternetBackEndRestClient实例。为了让@Autowired在其tracer字段上工作,Spring需要创建它。如果您使用如上所述的Spring测试基础设施,那么应该会发生这种情况。然后,您还需要将Spring创建的InternetBackEndRestClientTest实例注入到您的测试类中。谢谢。我已经用您遗漏的部分更新了示例;Tracer Tracer=Mockito.mockTracer.class;tracer=tracing.tracer;创建带有跟踪的上下文,但是当我调用真实类时,tracer仍然为null。您使用@InjectMocks意味着Mockito将创建InternetBackEndRestClient。它对@Autowired一无所知,所以tracer字段将为null。如果希望设置跟踪程序字段的值,Spring需要创建InternetBackEndRestClient实例。正如我在这里建议的那样,使用@SpringBootTest和SpringRunner可以实现这一点。对不起,您在示例中遗漏了什么?您可以看到我尝试测试的类以及测试类。我不能使用@MockBean,这很好。但是我只想用mockito做一个单元测试,我需要mock Brave.Trace,这样指令Span newSpan=tracer.nextSpan.namespanPasswordJwtResponse;不会因为变量tracer为null而失败。您的示例没有显示如何获取正在测试的InternetBackEndRestClient实例。为了让@Autowired在其tracer字段上工作,Spring需要创建它。如果您使用如上所述的Spring测试基础设施,那么应该会发生这种情况。然后,您还需要将Spring创建的InternetBackEndRestClientTest实例注入到您的测试类中。谢谢。我已经用您遗漏的部分更新了示例;Tracer Tracer=Mockito.mockTracer.class;tracer=tracing.tracer;创建带有跟踪的上下文,但是当我调用真实类时,tracer仍然为null。您使用@InjectMocks意味着Mockito将创建InternetBackEndRestClient。它对@Autowired一无所知,所以tracer字段将为null。如果希望设置跟踪程序字段的值,Spring需要创建InternetBackEndRestClient实例。正如我在这里建议的那样,使用@SpringBootTest和SpringRunner可以实现这一点。