spring cloud терпит неудачу, когда я пытаюсь издеваться над сыщиком в модульных тестах

Я сталкиваюсь с некоторой ошибкой, когда пытаюсь имитировать такие объекты, как Tracer и Span, в модульных тестах, если я использую версии Dalston.SR3 или Dalston.Release, но этой проблемы не возникает, если я использую версии Camden.SR6 или Camden.SR7.

Найдите пример кода здесь

Микросервис msvc-a использует версию Dalston и имеет два тестовых класса, где только класс, в котором я пытаюсь смоделировать объекты Tracer и Span, не работает.

Микросервис msvc-b использует версию Camden и имеет те же тестовые классы.

В то же время я не могу понять эту ситуацию, когда я нахожусь в режиме отладки в STS и почему я не вижу никакой трассировки ошибки или чего-то в этом роде... только NullpointerException.

введите здесь описание изображения

public class AbstractSpanAccessorTest {

    @MockBean
    private Tracer tracer;

    @MockBean
    private Span span;

    private Random random = new Random();

    @Before
    public void mockSpan() {
        long id = createId();
        Span spanMock = Span.builder().name("mock").traceId(id).spanId(id).build();
        doReturn(spanMock.traceIdString()).when(span).traceIdString();
        doReturn(span).when(tracer).getCurrentSpan();
        doReturn(span).when(tracer).createSpan(anyString());
    }

    private long createId() {
        return random.nextLong();
    }
}


person Francisco José Martínez Páez    schedule 29.08.2017    source источник
comment
Можете ли вы предоставить трассировку стека или что-то в этом роде? В настоящее время вы показываете на снимке экрана ситуацию, в которой нельзя сгенерировать NPE, поскольку ответ не может быть нулевым. И что значит, что ты пытаешься издеваться над Сыщиком? Пожалуйста, покажите свой тест и покажите, какая строка вызывает выброс NPE.   -  person Marcin Grzejszczak    schedule 29.08.2017
comment
Привет, у вас есть приведенная выше ссылка на пример кода (github.com/fjmpaez911/spring- облачный сыщик-ошибка). Доступной трассировки нет, но вы можете попробовать запустить модульный тест для обоих микросервисов и посмотреть, что происходит. В реальном сценарии мне нужно имитировать Tracer и Span, потому что я не хочу иметь ошибки, когда какой-то код, подобный этому, выполняется в модульном тесте (String traceIdString = spanAccessor.getCurrentSpan().traceIdString();)   -  person Francisco José Martínez Páez    schedule 29.08.2017
comment
Привет, я понимаю, что он у меня есть, но ты даже не написал, как его запустить или протестировать. Вы не указали ни на какие классы и т. д. Пожалуйста, предоставьте детали, которые я просил. В противном случае я не смогу вам помочь :/   -  person Marcin Grzejszczak    schedule 29.08.2017
comment
Хорошо, извини. вы можете столкнуться с проблемой, если запустите тестовые классы (ServiceTest2.java и ServiceTest.java)   -  person Francisco José Martínez Páez    schedule 29.08.2017
comment
При просмотре кода эти тесты являются интеграционными, а не модульными. Также я не вижу никакого издевательства. Можете ли вы показать мне, где вы издеваетесь над этим кодом?   -  person Marcin Grzejszczak    schedule 29.08.2017
comment
открытый класс ServiceTest2 расширяет AbstractSpanAccessorTest...   -  person Francisco José Martínez Páez    schedule 29.08.2017
comment
Давайте продолжим это обсуждение в чате.   -  person Francisco José Martínez Páez    schedule 29.08.2017


Ответы (2)


Это была моя ошибка. Правильный способ издеваться над Span:

 @Before
 public void mockSpan() {
     long id = createId();
     span = Span.builder().name("mock").traceId(id).spanId(id).build();
     doReturn(span).when(tracer).getCurrentSpan();
     doReturn(span).when(tracer).createSpan(anyString());
 }
person Francisco José Martínez Páez    schedule 30.08.2017

Трейсер вообще не стал бы издеваться над Finchley.SR2, поэтому я закончил с этим:

Tracing tracing = Tracing.newBuilder().build();
Tracer tracer = tracing.tracer();
person Mitch1077487    schedule 13.11.2018