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

JSP*_*r01 0 java spring unit-testing

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

@Service
public class BackgroundTaskService {
    @PostConstruct
    public void startTask() {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

当前,我正在设置系统属性以声明正在运行单元测试:

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

然后,我可以检查:

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

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

Kay*_*man 6

解决这个问题的更漂亮的方法是

@Service
public class BackgroundTaskService {

    @PostConstruct
    @Profile("!test")
    public void startTask() {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至

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

仅当测试配置文件激活时,该@PostConstruct方法才运行。在Spring环境中,您想使用Spring提供的工具,因此请使用配置文件代替某些自定义指标。