【问题标题】:Inject Single Mocked Object together with Spring Components into Component Constructor将单个模拟对象与 Spring 组件一起注入组件构造函数
【发布时间】:2022-01-20 05:05:11
【问题描述】:

我有一个服务 A。A 使用存储库 R 和服务 B。B 执行 REST 调用。 R 和 B 通过 A 的构造函数(推荐)注入。我现在想测试一个方法,其中 R 和 B 都被调用。但我只想模拟 B,因为测试数据库充满了很多测试数据,我想使用它。到目前为止,我无法用 Mockito 实现这种正确的注射。这是我的代码:

@Service class A {
    private final R repo;
    private final B service;

    @Autowired
    public A(R repo, B service) {
        this.repo = repo;
        this.service = service;
    }

    public int foo() {
        repo.doSomeStuff();
        service.doSomeStuff();
        ...
    }
}

@SpringBootTest
@ExtendWith(MockitoExtension.class)
class ATest {
    @Autowired A service;
    @Mock B mockedService;

    @BeforeEach
    void setupMocks() {
        MockitoAnnotations.openMocks(this);
    }

    @Test
    void testFoo() {
        service.foo();
        ...
    }
}

我已经尝试过在 ATest.service 上使用 @InjectMocks 的不同变体,也忽略了 @Autowired。到目前为止没有任何效果。甚至可能吗?我可能需要在 A 中使用 setter 注入吗?

【问题讨论】:

  • 删除@BeforeEach,删除@ExtendsWith。将@Mock 替换为@MockBean。运行测试。

标签: java spring-boot mocking mockito


【解决方案1】:

你把事情弄得太复杂了。使用@MockBean,Spring Boot 将完成剩下的工作。将您的测试重写为以下内容

@SpringBootTest
class ATest {
    @Autowired A service;
    @MockBean B mockedService;

    @Test
    void testFoo() {
        service.foo();
        ...
    }
}

就是这样,不多也不少。 Spring 现在将使用模拟的依赖项并将其注入到服务中。

有关使用 Spring Boot 进行测试的更多信息,我强烈建议阅读参考指南中的 Testing 部分。在使用 Spring Boot 和测试时,它还有一个完整的部分 mocking

【讨论】:

    猜你喜欢
    • 2016-11-19
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多