如何在运行单元测试时自动禁用Spring bean?

时间:2018-05-15 05:32:34

标签: java spring unit-testing

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

@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
    }
}

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

2 个答案:

答案 0 :(得分:4)

处理这个的更漂亮的方法是

@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提供的工具,因此请使用配置文件而不是某些自定义指示器。

答案 1 :(得分:1)

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

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