请提示我如何让侦察行李在联调系统中工作。它在测试通过模拟HTTP请求时按预期工作,但在测试直接调用服务时不工作。我的应用程序是(Spring Boot 2.5.4,Spring Cloud 2020.0.3):
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Bean
BaggageField myBaggageField() {
return BaggageField.create("my-field-name");
}
@RestController
static class MyController {
@AutowiredMyService myService;
@GetMapping
String callService() {
return myService.updateAndGet();
}
}
@Service
static class MyService {
@Autowired BaggageField baggageField;
public String updateAndGet() {
baggageField.updateValue("value");
return baggageField.getValue();
}
}
}
应用yml:spring。侦探。行李远程字段:我的字段名
测试:
@SpringBootTest
@AutoConfigureMockMvc
class MyApplicationTests {
@Autowired
MyService myService;
@Autowired
MockMvc mockMvc;
@Test
void testBaggageByService() {
assertThat(myService.updateAndGet()).isEqualTo("value"); // FAILS
}
@Test
void testBaggageByController() throws Exception {
mockMvc.perform(get("/")).andExpect(content().string("value")); // PASS
}
}
如果出于任何原因,启动一个span应该在许多测试中重用,那就是我的JUnit 5扩展:
public class SleuthExtension implements BeforeEachCallback, AfterEachCallback {
private static final Namespace SPAN_STORE_KEY = Namespace.create(SleuthExtension.class.getName());
private static final String SPAN_KEY = "test span";
@Override
public void beforeEach(ExtensionContext context) {
Tracer tracer = SpringExtension.getApplicationContext(context)
.getBean(Tracer.class);
ScopedSpan span = tracer.startScopedSpan("span for " + context.getDisplayName());
context.getStore(SPAN_STORE_KEY)
.put(SPAN_KEY, span);
}
@Override
public void afterEach(ExtensionContext context) {
context.getStore(SPAN_STORE_KEY)
.remove(SPAN_KEY, ScopedSpan.class)
.end();
}
}
这是意料之中的,因为您只是调用控制器的方法。Sleuth仪表基本上是一个Servlet过滤器,在第一次测试中没有调用,但在第二次测试中使用,因为它模拟接收真实的请求(而且,它也不是真正的联调)。
您可以手动创建跨度,并设置行李以模拟您跳过的行为。
请阅读文档关于冲洗和更新选项在勇敢-https://docs.spring.io/spring-cloud-sleuth/docs/current/reference/html/project-features.html#features-baggage
设置此选项,然后重试
// configuration
@Bean
BaggageField countryCodeField() {
return BaggageField.create("my-field-name");
}
@Bean
ScopeDecorator mdcScopeDecorator() {
return MDCScopeDecorator.newBuilder()
.clear()
.add(SingleCorrelationField.newBuilder(countryCodeField())
.flushOnUpdate()
.build())
.build();
}
编辑:
在你的评论中,你说:
好吧,Sleuth instrumentation是一个Servlet过滤器,但是另外还有很多其他的instrumentation,例如message listener、quartz scheduler等。我只是想也应该有用于集成测试的instrumentation
没有这样的集成,我看不出有任何意义。你必须自己启动一个跨度,在测试中手动启动,并将其放入范围内。你可以在这里找到一个例子https://github.com/spring-cloud/spring-cloud-sleuth/blob/v3.0.3/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/CircuitBreakerIntegrationTests.java#L55-L71
@Autowired
Tracer tracer;
@Autowired
CircuitBreakerFactory factory;
@Test
public void should_pass_tracing_information_when_using_circuit_breaker() {
// given
Tracer tracer = this.tracer;
ScopedSpan scopedSpan = null;
try {
scopedSpan = tracer.startScopedSpan("start");
// when
Span span = this.factory.create("name").run(tracer::currentSpan);
BDDAssertions.then(span).isNotNull();
BDDAssertions.then(scopedSpan.context().traceId()).isEqualTo(span.context().traceId());
}
finally {
scopedSpan.end();
}
}
问题内容: 我有两个表:和。 我想基于item_number从两个表中检索数据,并且在以下查询中工作正常。(使用内联接) 但是我也希望’items’表中的所有行,即使在opensalesorder和items中找不到与ItemName匹配的内容。 但是使用下面的查询似乎对我不起作用。 即使在左侧找不到匹配项,右联接也会从右表返回结果。 查询正确吗? 谢谢 问题答案: 这是您的查询: 该条件是“撤销
我第一次使用侦探需要一些帮助。我目前正在使用sleuth 2.2.3。释放我的要求是我想传播两个字段product id和product type,这样我就可以从其他微服务中读取这两个值,因为我正在使用baggage传播。
问题内容: 我有一个问题: 虽然我从另一个带有ajax的页面调用内联脚本(也使用jQuery),但似乎不再定义jQuery(?),并且我无法使用任何jQuery函数,应该使用(根据内联脚本)。 它基本上是新闻列表,其中包含指向特定新闻项目的链接。我现在更喜欢使用内联脚本,因为在其他地方不需要此功能。 如您所见,我只是在调用另一个页面的一部分并将其内容附加到页面上。 当我加载整个页面(不是页面的一部
我试图建立一个应用程序,它有一个角前端和一个Maven/Spring Boot后端,并建立了我的第一个REST控制器。我的问题是,当我从Angular IDE向后端发送GET HTTP请求时,它会返回一个错误,说明: 我的角代码只是试图使用GET方法(即。httpclient.GET('http://localhost:8080/api/getdata')将数据打印到浏览器控制台,但错误阻止了它的
我有这样的布局: 我试图将其用于我的索引页面,如下所示: 但它就是不起作用,引导和css文件没有被索引页使用,页脚和页眉也没有。我使用thymeleaf布局方言2.2.2我缺少什么?
问题内容: 我正在尝试占用和div未使用的任何空间。为此,我将flex显示设置为列方向。然后,我将属性设置为1。似乎没有做任何事情。 注意:不确定这是否重要,但是我正在进行一些嵌套的flex显示。 HTML CSS 问题答案: 您代码中的所有内容都可以正常工作。 唯一的问题是 您的flex容器没有指定的高度 。因此,高度解析为,表示内容的高度。 该属性在容器中分配 可用 空间。容器中没有可用空间,