当前位置: 首页 > 知识库问答 >
问题:

用嵌套的TestConfiguration覆盖Spring Boot 2.1切片测试中的bean

商夜洛
2023-03-14

我刚刚将一个应用程序从Spring Boot1.x迁移到2.1。我的一个测试由于bean重写默认值的更改而失败

我试图将spring.main.allow-bean-definition-overring设置为true,但这不起作用。

您可以使用以下类再现此问题:

@Configuration
public class ClockConfig {

    @Bean
    public Clock clock() {
        return Clock.systemUTC();
    }

}

@Service
public class MyService {

    private final Clock clock;

    public MyService(Clock clock) {
        this.clock = clock;
    }

    public Instant now() {
        return clock.instant();
    }

}

@RestController
public class MyResource {

    private final MyService myService;

    public MyResource(MyService myService) {
        this.myService = myService;
    }

    @GetMapping
    public ResponseEntity<Instant> now() {
        return ResponseEntity.ok(myService.now());
    }
}

不及格的测试。Spring Boot2.1从不调用clock()方法,而Spring Boot1.5或Spring Boot2.0则调用了它。

@RunWith(SpringRunner.class)
@WebMvcTest(MyResource.class)
@ContextConfiguration(classes = MyService.class)
public class ResourceTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void test() {
    }

    @TestConfiguration
    static class TestConfig {
        @Bean
        public Clock clock() {
            return Clock.fixed(Instant.MIN, ZoneId.of("Z"));
        }
    }
}

共有1个答案

陶俊晤
2023-03-14

尝试修改ContextConfiguration注释。它应该是:@contextConfiguration(classes={MyService.class,ClockConfig.class})。您用@ContextConfiguration注释显式指定了要在测试中导入的配置,这样就不会加载@testconfiguration。如果排除@contextconfiguration,它可以工作。由于您删除了myservice的配置,因此必须在测试配置中提供myservicebean。试试看:

@RunWith(SpringRunner.class)
@WebMvcTest(MyResource.class)
public class DemoApplicationTests {

   @Autowired
   private MockMvc mvc;

   @Test
   public void test() {
   }

   @TestConfiguration
   static class TestConfig {
       @Bean
       public Clock clock() {
           return Clock.fixed(Instant.MIN, ZoneId.of("Z"));
       }

       @Bean
       public MyService service() {
           return new MyService(clock());
       }
   }
  }
 类似资料:
  • 问题内容: 假设我有以下python代码: 我想调用external()返回“字符串已被嵌套函数更改!”,但我得到了“”。我得出结论,Python认为该行是对inner()局部的新变量的声明。我的问题是:如何告诉Python应该使用external()字符串?我不能使用关键字,因为字符串不是全局的,它只存在于外部作用域中。有想法吗? 问题答案: 在Python 3.x中,可以使用关键字: 在Pyt

  • 对不起我的英语。我对junit测试有问题。客户机要求覆盖所有类,即使是dto/model/entity(即使是错误的,我也必须这样做)。但我在测试getter和setter时遇到困难。我无法覆盖,我已经测试了许多解决方案,但要么覆盖率为0,要么出现错误,我该怎么办? 我的班级: 我的班级测试 always error,例如last when:when()需要的参数必须是“模拟的方法调用”。例如:w

  • 11.3. 测试覆盖率 就其性质而言,测试不可能是完整的。计算机科学家Edsger Dijkstra曾说过:“测试能证明缺陷存在,而无法证明没有缺陷。”再多的测试也不能证明一个程序没有BUG。在最好的情况下,测试可以增强我们的信心:代码在很多重要场景下是可以正常工作的。 对待测程序执行的测试的程度称为测试的覆盖率。测试覆盖率并不能量化——即使最简单的程序的动态也是难以精确测量的——但是有启发式方法

  • 我可以在声纳获得单位测试覆盖率通过使用Jacoco工具的代码覆盖率,并使用其报告在声纳属性文件为'sonar.jacoco.report路径=.../Reports/report.exec'。如何通过使用RAD的默认插件获得SONAR中的单元测试覆盖率,该插件以. coveragedata、. Analysis和. html格式生成报告?

  • 问题内容: 我有这个简单的代码: 我期望它可以打印,但是可以打印。这里发生了什么? 问题答案: 这是因为在循环中,您使用 副本 而不是slice / array元素本身进行操作。 将使得它遍历元素的副本,并追加此一时,循环变量的地址- 这是在所有的迭代相同。因此,您将相同的指针添加3次。而且此临时变量将在最后一次迭代(数组的最后一个元素)中设置为,因此这就是为什么您看到该变量打印了3次的原因。 修