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

在单元测试中使用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()调用,使其无效。

  • 问题内容: 如果是跑它运行在您的文件结尾通过运行启动格式的功能和使用(* T testing.T)模块。我想知道文件中的每个功能是同时运行还是确定地分别运行每个功能?是否为每个人创建一个执行例程?如果确实为每个例程创建了一个go例程,是否可以某种方式监视go例程?是否有可能做类似的事情并为每个实例获取一个实例并对其进行监控,诸如此类? 注意:这个问题假设您使用go(测试)随附的测试框架。 问题答案