【问题标题】:How do I use mocks in some cases but not others in QuarkusTest?在 QuarkusTest 中如何在某些情况下使用模拟,但在其他情况下不使用?
【发布时间】:2019-08-11 13:41:14
【问题描述】:

我在 Quarkus 应用程序中有两个类,我们称它们为 Service A 和 Service B。Service B 是 A 的依赖项。当我测试 ServiceA 时,我想模拟 ServiceB。当我测试ServiceB时,我想测试真正的Service B。

我在this guide on quarkus.io 之后创建了一个 MockServiceB 类。如果我把它放在我的 /test 目录中,我的 ServiceATest 将正确地抓取模拟。但我的 ServiceBTest 课程也是如此。如何有选择地将模拟注入不同的类?更好的是,我可以有选择地为不同的方法使用不同的模拟吗?

(我尝试回退到使用 Mockito,但它似乎不适用于 Quarkus 和 QuarkusTest,除非我弄错了。)

@ApplicationScoped
public class ServiceA {
    @Inject
    ServiceB serviceB;

    public int giveMeANumber() {
        serviceB.getNumber();
    }
}

@ApplicationScoped
public class ServiceB {

    public int getNumber() {
        // does the real work;
        return 1;
    }
}


@QuarkusTest
class ServiceATest {
    @Inject
    ServiceA serviceA;

   @Test
    public void shouldReturnNumber() {
        int number = serviceA.giveMeANumber();
        assertEquals(1, number);
    }
}

@Mock
@ApplicationScoped
class MockServiceB extends ServiceB {
    @Override
    public int getNumber() {
        // don’t do the real work
        return 1;
    }
}

@QuarkusTest
class ServiceBTest {

    @Inject
    ServiceB serviceB;

    @Test
    public void shouldGetNumber() {
        int number = serviceB.getNumber();
        // uses the mock, I don't want it to
        assertEquals(1, number);
    }
}

【问题讨论】:

  • 目前不支持开箱即用,但未来可能会改变
  • 好的,谢谢。我认为这对我来说可能是一个交易破坏者。现在可能需要将 Quarkus 放回货架上。
  • 实现这一点的能力可能更接近而不是更进一步。建议大家多多留意
  • 酷。我将以一种可以轻松迁移到 quarkus 的方式进行构建
  • @geoand 发现 this ticket 跟踪这个问题,还有其他的吗?

标签: dependency-injection quarkus


【解决方案1】:

从 Quarkus 1.4 开始,您可以使用 @InjectMock 注释将 Mockito 模拟用于正常范围的 CDI bean(因此 @ApplicationScoped 可以被模拟,@Singleton 不能)。 有关文档,请参阅 this,有关用法示例,请参阅 this

【讨论】:

    猜你喜欢
    • 2010-10-12
    • 1970-01-01
    • 2014-05-24
    • 2019-08-08
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2019-01-29
    • 2015-05-02
    相关资源
    最近更新 更多