1

如果我使用Dalston.SR3或Dalston.Release版本嘗試在單元測試中模擬對象(如Tracer和Span),則會面臨一些錯誤,但此問題不會如果我使用Camden.SR6或Camden.SR7版本,則不會發生。當我嘗試在單元測試中模擬偵查時,彈簧雲失敗

找到一個示例代碼here

的microService MSVC-A使用達爾斯頓版本,有兩個測試類,其中只有失敗在那裏我試圖嘲弄示蹤和跨度對象的類。

微服務msvc-b正在使用卡姆登版本並具有相同的測試類。

同時,當我處於STS調試模式時,我無法理解這種情況,爲什麼我看不到任何錯誤跟蹤或類似的東西......只有NullpointerException。

enter image description here

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

+0

你可以提供一個堆棧跟蹤或某事?目前,您在屏幕截圖中顯示的情況是,由於響應不能爲空,因此不能拋出NPE。此外,這是什麼意思,你試圖模仿Sleuth?請顯示您的測試並顯示哪一行導致NPE被拋出。 –

+0

嗨,你有一個上面的示例代碼鏈接(https://github.com/fjmpaez911/spring-cloud-sleuth-error)。 沒有可用的跟蹤,但您可以嘗試運行這兩個微服務的單元測試,看看發生了什麼。 在真實場景中,我需要模擬Tracer和Span,因爲我不想在單元測試中執行類似這樣的代碼時發生錯誤(String traceIdString = spanAccessor.getCurrentSpan()。traceIdString();) –

+0

你好,我明白我擁有它,但你甚至沒有寫如何運行或測試它。你沒有指向任何課程等請提供我所要求的細節。否則我將無法爲您提供幫助:/ –

回答

0

這是我的錯誤。正確的方法來模擬跨度是:

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