【发布时间】:2019-12-30 06:39:07
【问题描述】:
目前正在进行一个项目,该项目需要我为我已实现的所有代码编写单元测试。
我是编写单元测试的新手,最近学习了使用 @MockBeans、@InjectMocks、@Spy 等注释编写测试用例的知识,以帮助我测试特定的方法。
但是,有时我确实在编写无法模拟的测试用例时遇到困难,最终成为集成测试。以下是我在编写测试用例时遇到的一些场景。
-
服务层的单元测试最终成为一个集成测试,因为它与 repo 层交互。
- repo 层将 Tuple (
javax.persistence.tuple) 列表返回给服务层。 - 模拟了 repo 层,没有问题。
- 尝试创建当通过 Mockito.when() 调用 repo 层时应该返回的元组列表,但是,我无法创建元组列表,因为它没有任何 setter 方法。
- 以单元测试结束,对数据库执行实际查询以检索出值,这使得单元测试更像是集成测试。
- repo 层将 Tuple (
-
其中涉及工厂方法调用的方法。工厂类被编写为静态类,然后返回的具体类使用
AutowireCapableBeanFactory自动装配到 Spring 上下文中- 由于无法模拟静态工厂,我只需将值传入工厂并让它相应地返回具体类。
- 无法模拟工厂返回的具体类。
- 单元测试最终也会测试具体类。
-
使用
new ConcreteClass()实例化新类的方法 而不是@Autowired。- 我认为这类似于我上面提到的第二种情况。
- @MockBeans 在这里不起作用,因为具体类不是使用 @Autowired 创建的。
这些是我目前面临的情况,我花了很多时间试图弄清楚编写测试用例的正确方法是什么,或者更确切地说,我应该如何设计我的代码可以避免所有这些问题吗?感谢您对这些场景的反馈和帮助,以改进我编写单元测试或代码设计的方式,使其更具可测试性!
【问题讨论】:
标签: java spring unit-testing testing junit