【问题标题】:How to automatically disable a Spring bean when running a unit test?运行单元测试时如何自动禁用 Spring bean?
【发布时间】:2018-05-15 05:32:34
【问题描述】:

我有一个服务类,它启动一个线程并运行一些后台任务。在我运行单元测试时不应运行这些任务。服务类本身非常简单,不需要进行单元测试。就像:

@Service
public class BackgroundTaskService {
    @PostConstruct
    public void startTask() {
        // ...
    }
}

目前我正在设置一个系统属性来声明单元测试正在运行:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SomeTest {
    static {
        System.setProperty("unit_testing", "true");
    }
    @Test
    public void test() {}
}

然后我可以检查:

@PostConstruct
public void startTask() {
    if (System.getProperty("unit_testing") != null) {
        return;  // skip background tasks
    }
}

我想知道是否有更好的方法来做到这一点。

【问题讨论】:

  • 你在TestClass上使用了哪些注解来加载spring上下文
  • 您可以通过new myObject() 手动实例化您的对象来避免调用@PostConstruct 方法,否则,如果您使用@Autowired,您的@PostConstruct 方法将被调用。
  • 似乎是个坏主意。请参阅此SO 线程,了解如何测试线程代码。
  • @HemantPatel 哦抱歉忘记了,现在添加。只是普通的 Spring Boot 和 JUnit 注释。
  • 我会让它依赖于 test 配置文件处于活动状态而不是自定义系统属性。

标签: java spring unit-testing


【解决方案1】:

处理这个问题的更好方法是

@Service
public class BackgroundTaskService {

    @PostConstruct
    @Profile("!test")
    public void startTask() {
        // ...
    }
}

甚至

@PostConstruct
public void startTask() {
    if(env.acceptsProfiles("!test")) {  // env is @Autowired Environment
        // start task
    }
}

仅当测试配置文件处于活动状态时,@PostConstruct 方法才会运行。在 Spring 环境中,您想使用 Spring 提供的工具,因此请使用配置文件而不是某些自定义指标。

【讨论】:

  • 很好,我不知道您可以将@Profile 放在方法级别。
【解决方案2】:

即使是简单的代码也不要跳过单元测试,但如果你真的想这样做,你可以看看this线程。您可以使用静态布尔变量来代替属性。

社区注意事项:我是这个论坛的新手,所以我的声誉不允许我发表评论。谢谢。

【讨论】:

    【解决方案3】:

    考虑@MockBean@MockBean 的存在将删除被模拟的 bean:

    在上下文中定义的任何现有的相同类型的单个 bean 都将被 mock 替换。

    https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/mock/mockito/MockBean.html

    mock 的所有方法都不会调用原始行为,而是默认返回一个空白或空值:

    默认情况下,对于所有返回值的方法,mock 将根据需要返回 null、原始/原始包装器值或空集合。

    https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html

    这对于一个人的用例来说可能不够好,也可能不够好,用虚拟 bean 替换普通 bean,而不是完全禁用 bean。

    【讨论】:

      猜你喜欢
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 2011-08-13
      • 2015-06-25
      • 1970-01-01
      • 2016-06-12
      • 2018-08-06
      相关资源
      最近更新 更多