我有一个服务SomeService,其中有一个方法来执行一些逻辑。
@Override
public CompletableFuture<Boolean> process(User user) {
Objects.requiredNonNull(user, "user must not be null");
// other logic...
}
那我有个测试。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = { SomeService.class })
public class SomeServiceTest {
@Autowired private SomeService tested;
@Test
public void user_null_expect_NullPointerException() {
assertThatThrownBy(() -> tested.process(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("user must not be null");
}
}
在我决定使该方法异步之前,它一直工作得很好。
@Async
@Override
public CompletableFuture<Boolean> process(User user) {
Objects.requiredNonNull(user, "user must not be null");
// other logic...
}
所以,现在它不工作是因为Spring代理。有人知道我必须如何配置我的测试才能使它再次工作吗?
2条答案
按热度按时间vcirk6k61#
好的,我有一个解决方案。问题不是在异步方法中,问题是在错误的Assert中。我不知道AssertJ能够测试CompletableFuture。
所以我的解决方案是:
如果你有更好的解决办法,告诉我。
pbpqsu0x2#
当你对你的服务类进行单元测试时,不需要启动一个Spring上下文,但是你可以直接示例化你的类,避免了由于
@Async
而导致的代理。测试将更容易和更快。@Async
属于框架,通常框架特性不应在单元测试的范围内(而它们可以用于组件/集成测试)。Spring的一篇博客文章也建议:
对Spring
@Component
进行单元测试的最简单的方法就是完全不涉及Spring!最好的方法是尝试并构建代码,以便类可以被示例化并直接测试。通常这可以归结为几件事: