当前位置: 首页 > 知识库问答 >
问题:

在单元测试中使用SpringRunner可以吗?

郑松
2023-03-14
public class RewardDurationCalculator {

    private Clock clock;

    public OptionalLong calculate(DurationType durationType, List<Pass> passes) {
        long now = Instant.now(clock).getEpochSecond();
        switch (durationType) {
            case FULL_PASS:
                return getCurrentPassDuration(passes, now);
            case TILL_THE_END_OF_THE_CURRENT_ACTIVE_PASS:
                return getTimeInCurrentPassLeft(passes, now);
        }
        return OptionalLong.empty();
    }

    private OptionalLong getCurrentPassDuration(List<Pass> passes, long now) {
        return passes.stream()
                .filter(currentPass(now))
                .mapToLong(Pass::getDuration)
                .findFirst();
    }

    private OptionalLong getTimeInCurrentPassLeft(List<Pass> passes, long now) {
        return passes.stream()
                .filter(currentPass(now))
                .mapToLong(pass -> getEndTs(pass) - now)
                .findFirst();
    }

    private Predicate<Pass> currentPass(long now) {
        return pass -> pass.getStartTs() >= now && now <= getEndTs(pass);
    }

    private long getEndTs(Pass pass) {
        return pass.getStartTs() + pass.getDuration();
    }

}
@Configuration
public class RewardDurationCalculatorConfiguration {

    @Bean
    public RewardDurationCalculator rewardDurationCalculator(Clock clock) {
        return new RewardDurationCalculator(clock);
    }

}

那么为什么我不能像这样为它编写单元测试:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = RewardDurationCalculatorConfiguration.class)
public class RewardDurationCalculatorTest {

    @MockBean
    private Clock clock;
    @Autowired
    private RewardDurationCalculator rewardDurationCalculator;

    @Test
    public void testCalculateCurrentPassDurationShouldBeReturnedIfPassWasCreatedRightNow() {
        rewardDurationCalculator.calculate(DurationType.FULL_PASS, Collections.emptyList());
    }

}

使用这种方法我会面临什么缺点?

共有1个答案

羊舌新荣
2023-03-14

我倾向于同意你的同事。

单元测试应该只测试小的代码单元,通常是单个类。他们应该只执行测试中的单元,而不执行来自该单元依赖项的任何代码。

这样做的一个原因是单元测试应该尽可能快地执行。在测试驱动开发(TDD)中,您希望能够运行套件,或者至少是它的一个相关子集,通常是在您所做的每一个小的更改之后,以验证您没有破坏任何现有的行为。只有当测试的反馈是瞬时的时,这才是可行的。如果您必须等待测试结果太长时间,则运行它们的次数将减少,这意味着反馈循环将变得更长。

 类似资料:
  • 我正在为一个Android库设置单元测试代码覆盖率,该库使用Robolectric运行测试,并使用PowerMock/Mockito进行模拟测试。 但是,使用Cobertura运行单元测试会导致以下异常... *即使用PowerMock注释测试,删除注释、和调用。 我看到一些用户通过在他们的测试套件中设置来修复类似的问题。 但是,这不是解决方案,因为我使用的是Gradle,它在Java项目上默认为

  • 问题内容: 我的意图是使用API中描述的JUnit方法来验证类中的一种方法。 但是Eclipse向我显示了无法识别这种方法的错误消息。这两个进口到位: 我错过了什么? 问题答案: 这应该适用于JUnit 4: (答案基于此Wiki文章) 这与旧的JUnit框架(JUnit 3)相同: 注意区别:没有注释,测试类是TestCase的子类(实现静态断言方法)。

  • 我使用这本优秀的书(Python中的测试驱动开发)发现了Python上的TDD,到目前为止,我很喜欢它。 但是,我有一个关于创建单元测试的方式的问题。 让我们想象一下这样的事情: 如果我想测试A,它会非常简单:我将在我的单元测试中手动创建一个对象,并测试它,类似于这样: 但是,如何测试B?我可以看到这样的方式: 手动创建modified_MyObject并用它来测试B 在testB()中使用A()

  • 我想测试一个返回可选客户机的方法。 我一直在跟踪这个链接Mockito错误,方法返回可选的

  • 我正在将Grails2中的一系列单元测试升级到Grails3,并在使用Spock数据驱动测试格式驱动测试的域测试中遇到问题。 当我执行测试时,因为测试执行没有填充测试中的错误、字段和val引用。如前所述,这个测试适用于Grails2.5.5,所以我怀疑我缺少了Grails3中需要的一些东西。 Edited:我删除了原来在setup()中的mockForConstraints()调用,使其无效。

  • 问题内容: 我有一个ASP.NET MVC 5 Web项目,并且我有一个基于MsTest的单元测试项目,该项目使用Selenium进行一些自动化的“浏览器”测试。 当前,我必须运行Web项目(在本地IIS Express中),然后针对该项目运行测试,但这有各种限制。例如,我只能“运行”测试,而不能“调试”它们。显然,这与我的持续集成流程并不合适。 没有办法让测试启动网站实例吗?(我知道ASP.NE