Java 如何在运行单元测试时自动禁用Springbean?

Java 如何在运行单元测试时自动禁用Springbean?,java,spring,unit-testing,Java,Spring,Unit Testing,我有一个服务类,它启动一个线程并运行一些后台任务。在我运行单元测试时,不应运行这些任务。服务类本身非常简单,不需要进行单元测试。就像: @Service public class BackgroundTaskService { @PostConstruct public void startTask() { // ... } } 目前,我正在设置一个系统属性以声明单元测试正在运行: @RunWith(SpringRunner.class) @Spring

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

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

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

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


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

处理这个问题的一个更漂亮的方法是

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

您在
TestClass
上使用什么注释来加载Spring上下文您可以通过
new myObject()手动实例化对象来避免调用@PostConstruct方法
否则,如果您正在使用
@Autowired
将调用
@PostConstruct
方法。这似乎是个坏主意。有关如何测试线程代码的信息,请参阅此线程。@HemantPatel哦,很抱歉,忘记了这一点,现在添加。只是普通的Spring引导和JUnit注释。我会让它取决于
测试
配置文件是否处于活动状态,而不是自定义系统属性。很好,我不知道你可以将@profile放在方法级别。